Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Rata-rata inkonsistensi float

Ini sangat mirip dengan:SELECT SUM(...) is non-deterministic when adding the column-values of datatype float .

Masalahnya adalah dengan tipe data yang tidak akurat (FLOAT/REAL ) urutan operasi aritmatika pada masalah floating point. Demo dari koneksi:

DECLARE @fl FLOAT = 100000000000000000000
DECLARE @i SMALLINT = 0
WHILE (@i < 100)
BEGIN
    SET @fl = @fl + CONVERT(float, 5000)
    SET @i = @i + 1
END
SET @fl = @fl - 100000000000000000000
SELECT CONVERT(NVARCHAR(40), @fl, 2)
-- 0.000000000000000e+000


DECLARE @fl FLOAT = 0
DECLARE @i SMALLINT = 0
WHILE (@i < 100)
BEGIN
    SET @fl = @fl + CONVERT(float, 5000)
    SET @i = @i + 1
END
SET @fl = @fl + 100000000000000000000
SET @fl = @fl - 100000000000000000000
SELECT @fl
-- 507904

LiveDemo

Kemungkinan solusi:

  • CAST semua argumen ke tipe data yang akurat seperti DECIMAL/NUMERIC
  • ubah tabel dan ubah FLOAT ke DECIMAL
  • Anda dapat mencoba memaksa pengoptimal kueri untuk menghitung jumlah dengan urutan yang sama.

Kabar baiknya adalah ketika hasil kueri yang stabil penting bagi aplikasi Anda, Anda dapat memaksa agar urutannya sama dengan mencegah paralelisme dengan OPTION (MAXDOP 1) .

Sepertinya tautan awal sudah mati. Arsip Web




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Membuat tabel SQL Server dari tabel data C#

  2. Dapatkan baris di mana kolom datetime =hari ini - SQL server noob

  3. Log transaksi untuk database sudah penuh

  4. LEFT() vs SET TEXTSIZE di SQL Server:Apa Bedanya?

  5. Bagaimana Fungsi SQL Server DIFFERENCE() Bekerja