sql >> Databasteknik >  >> RDS >> Sqlserver

SQL server 2005 numerisk precision förlust

Precis som addition av float-typen är felaktig, kan multiplikation av decimaltyperna vara felaktig (eller orsaka felaktighet) om du överskrider precisionen. Se Datatypkonvertering och decimal och numerisk .

Sedan du multiplicerat NUMERIC(24,8) och NUMERIC(24,8) , och SQL Server kommer bara att kontrollera typen inte innehållet, kommer den förmodligen att försöka spara de potentiella 16 icke-decimalsiffrorna (24 - 8) när den inte kan spara alla 48 siffror med precision (max är 38). Kombinera två av dem, du får 32 icke-decimala siffror, vilket ger dig endast 6 decimalsiffror (38 - 32).

Alltså den ursprungliga frågan

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

minskar till

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

Återigen, mellan NUMERIC(24,8) och NUMERIC(38,6) , kommer SQL Server att försöka spara de potentiella 32 siffrorna för icke-decimaler, så A + D minskar till

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

vilket ger dig 0.123457 efter avrundning.



  1. Det enklaste sättet att lägga till flera utrymmen till en sträng i MySQL – SPACE()

  2. Laravel 4-migreringar ger 1072-fel

  3. Funktioner vs lagrade procedurer

  4. MySQL-infogning vid dubblettuppdatering för icke-PRIMÄR nyckel