Cũng giống như phép cộng kiểu float là không chính xác, phép nhân các kiểu thập phân có thể không chính xác (hoặc gây ra sự thiếu chính xác) nếu bạn vượt quá độ chính xác. Xem Chuyển đổi loại dữ liệu và thập phân và số .
Vì bạn đã nhân NUMERIC(24,8)
và NUMERIC(24,8)
và SQL Server sẽ chỉ kiểm tra loại chứ không phải nội dung, nó có thể sẽ cố gắng lưu 16 chữ số không thập phân tiềm năng (24 - 8) khi nó không thể lưu tất cả 48 chữ số chính xác (tối đa là 38). Kết hợp hai trong số chúng, bạn sẽ có 32 chữ số không phải thập phân, chỉ còn lại 6 chữ số thập phân (38 - 32).
Do đó, truy vấn ban đầu
SELECT A, B, C, A + B * C
FROM ( SELECT CAST(0.12345678 AS NUMERIC(24,8)) AS A,
CAST(0 AS NUMERIC(24,8)) AS B,
CAST(500 AS NUMERIC(24,8)) AS C ) T
giảm xuống
SELECT A, B, C, A + D
FROM ( SELECT CAST(0.12345678 AS NUMERIC(24,8)) AS A,
CAST(0 AS NUMERIC(24,8)) AS B,
CAST(500 AS NUMERIC(24,8)) AS C,
CAST(0 AS NUMERIC(38,6)) AS D ) T
Một lần nữa, giữa NUMERIC(24,8)
và NUMERIC(38,6)
, SQL Server sẽ cố gắng lưu 32 chữ số tiềm năng của các số không phải số thập phân, vì vậy A + D
giảm xuống
SELECT CAST(0.12345678 AS NUMERIC(38,6))
cung cấp cho bạn 0.123457
sau khi làm tròn.