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 sepertiDECIMAL/NUMERIC
- ubah tabel dan ubah
FLOAT
keDECIMAL
- 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