Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Trung bình của sự không nhất quán float

Điều này rất giống với: SELECT SUM(...) is non-deterministic when adding the column-values of datatype float .

Vấn đề là với loại dữ liệu không chính xác (FLOAT/REAL ) thứ tự của các phép toán số học trên các vấn đề dấu phẩy động. Demo từ kết nối:

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

Các giải pháp khả thi:

  • CAST tất cả các đối số cho loại dữ liệu chính xác như DECIMAL/NUMERIC
  • thay đổi bảng và thay đổi FLOAT thành DECIMAL
  • bạn có thể cố gắng buộc trình tối ưu hóa truy vấn tính tổng với cùng một thứ tự.

Tin tốt là khi một kết quả truy vấn ổn định quan trọng đối với ứng dụng của bạn, bạn có thể buộc thứ tự giống nhau bằng cách ngăn chặn tính song song với OPTION (MAXDOP 1) .

Có vẻ như liên kết nội bộ đã chết. WebArchive




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để tìm các bản sao trên nhiều cột?

  2. làm thế nào để bỏ qua một hàng xấu trong nguồn tệp phẳng ssis

  3. 2 cách trả về tất cả các hàm do người dùng xác định trong cơ sở dữ liệu máy chủ SQL

  4. Hàm có giá trị bảng trong SQL Server là gì?

  5. Stuff và 'For Xml Path' hoạt động như thế nào trong SQL Server?