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

SQL server 2005 mất độ chính xác số

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 thập phân và số .

Vì bạn đã nhân NUMERIC(24,8)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)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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Có cách nào để đơn giản hóa so sánh NULL của 2 giá trị không

  2. thực hiện có chọn lọc tác vụ trong luồng điều khiển ssis

  3. SQL Server 2008 R2 bị mắc kẹt trong chế độ một người dùng

  4. Cách tạo trình kích hoạt sẽ lưu dữ liệu đã xóa (nhiều bản ghi) vào Bảng sản xuất

  5. Có .NET tương đương với newsequentialid () của SQL Server không