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

SQL server 2005 kehilangan presisi numerik

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa ada celah dalam nilai kolom IDENTITY saya?

  2. SQL:Kolom Akumulatif &Jumlah Seluruh Baris

  3. Cara mengurangi ukuran tabel SQL Server yang tumbuh dari perubahan tipe data

  4. 2 Cara Mengembalikan Semua Fungsi Buatan Pengguna dalam Database SQL Server

  5. DATETIMEOFFSETFROMPARTS() Contoh di SQL Server (T-SQL)