Sama seperti penambahan tipe float tidak akurat, perkalian tipe desimal bisa tidak akurat (atau menyebabkan ketidakakuratan) jika Anda melebihi presisi. Lihat Konversi Jenis Data dan desimal dan numerik .
Karena Anda mengalikan NUMERIC(24,8)
dan NUMERIC(24,8)
, dan SQL Server hanya akan memeriksa jenisnya bukan kontennya, mungkin akan mencoba menyimpan potensi 16 digit non-desimal (24 - 8) ketika tidak dapat menyimpan semua 48 digit presisi (maks adalah 38). Gabungkan dua di antaranya, Anda mendapatkan 32 digit non-desimal, yang membuat Anda hanya memiliki 6 digit desimal (38 - 32).
Jadi kueri asli
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
dikurangi menjadi
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
Sekali lagi, antara NUMERIC(24,8)
dan NUMERIC(38,6)
, SQL Server akan mencoba menyimpan potensi 32 digit non-desimal, jadi A + D
dikurangi menjadi
SELECT CAST(0.12345678 AS NUMERIC(38,6))
yang memberi Anda 0.123457
setelah pembulatan.