sql >> Database >  >> RDS >> Sqlserver

Verlies van numerieke precisie van SQL server 2005

Net zoals toevoeging van het type float onnauwkeurig is, kan vermenigvuldiging van de decimale typen onnauwkeurig zijn (of onnauwkeurigheid veroorzaken) als u de precisie overschrijdt. Zie Conversie van gegevenstype en decimaal en numeriek .

Omdat je NUMERIC(24,8) . hebt vermenigvuldigd en NUMERIC(24,8) , en SQL Server controleert alleen het type en niet de inhoud, het zal waarschijnlijk proberen de potentiële 16 niet-decimale cijfers (24 - 8) op te slaan als het niet alle 48 cijfers van precisie kan opslaan (max is 38). Als je er twee combineert, krijg je 32 niet-decimale cijfers, waardoor je nog maar 6 decimale cijfers hebt (38 - 32).

Dus de oorspronkelijke vraag

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

reduceert tot

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

Nogmaals, tussen NUMERIC(24,8) en NUMERIC(38,6) , zal SQL Server proberen de mogelijke 32 cijfers van niet-decimalen op te slaan, dus A + D reduceert tot

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

die je 0.123457 . geeft na afronding.



  1. Hoe werk ik met zeer nauwkeurige decimalen in PHP

  2. Hoe te testen in en tussen elk van de verschillende tafels?

  3. Recursieve logica in PHP + MySQL

  4. Topbronnen voor leren en trainen van PostgreSQL