Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Загуба на числена точност на SQL сървър 2005

Точно както добавянето на типа float е неточно, умножението на десетичните типове може да бъде неточно (или да причини неточност), ако превишите прецизността. Вижте Преобразуване на типове данни и десетични и цифрови .

Тъй като сте умножили NUMERIC(24,8) и NUMERIC(24,8) и SQL Server ще проверява само типа, но не и съдържанието, вероятно ще се опита да запази потенциалните 16 недесетични цифри (24 - 8), когато не може да запази всичките 48 цифри с точност (максимумът е 38). Комбинирайте две от тях и получавате 32 недесетични цифри, което ви оставя само с 6 десетични цифри (38 - 32).

Така първоначалната заявка

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

намалява до

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

Отново между NUMERIC(24,8) и NUMERIC(38,6) , SQL Server ще се опита да запази потенциалните 32 цифри, които не са десетични, така че A + D намалява до

SELECT CAST(0.12345678 AS NUMERIC(38,6))

което ви дава 0.123457 след закръгляване.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да прехвърлите varchar към XML в заявка OUTER APPLY

  2. SSMS версия 18 – няма диаграми на база данни

  3. T-SQL:Как да използвам параметри в динамичен SQL?

  4. Как да предадете нулева променлива към SQL съхранена процедура от C#.net код

  5. Как да използвам case оператор във функция със скаларни стойности в SQL?