sql >> Databáze >  >> RDS >> Sqlserver

SQL Server 2005 ztráta číselné přesnosti

Stejně jako sčítání typu float je nepřesné, násobení desetinných typů může být nepřesné (nebo způsobit nepřesnost), pokud překročíte přesnost. Viz Konverze typu dat a desítkové a numerické .

Protože jste vynásobili NUMERIC(24,8) a NUMERIC(24,8) a SQL Server zkontroluje pouze typ, nikoli obsah, pravděpodobně se pokusí uložit potenciálních 16 nedecimálních číslic (24 - 8), když nemůže uložit všech 48 číslic s přesností (max je 38). Spojením dvou z nich získáte 32 nedesítkových číslic, což vám zbude pouze 6 desetinných číslic (38 - 32).

Tedy původní dotaz

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

sníží na

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

Opět mezi NUMERIC(24,8) a NUMERIC(38,6) , SQL Server se pokusí uložit potenciálních 32 číslic bez desítkových čísel, takže A + D sníží na

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

což vám dává 0.123457 po zaokrouhlení.



  1. ORDER BY datetime velmi zpomaluje dotaz

  2. Oracle vrací stejný alias pro různé případy na select

  3. Automatizujte úlohy zálohování a údržby pomocí plánu údržby na serveru SQL Server

  4. Jak mohu této výjimce zabránit? java.sql.SQLException:Selhání převodu na interní reprezentaci: