En appliquant abs sur des données divisibles, le quotient des nombres entiers est converti en décimal.

create table #data ( ConditionValue money, ConditionRateNbr real)
              insert into #data values(9665.77,37.61)
              select abs(conditionvalue/conditionrateNbr) Using_Abs ,* 
         from #data

--Using_Abs         ConditionValue  ConditionRateNbr
--256.999969482422  9665.77         37.61

Pourquoi cela se produit et comment résoudre?

sql
1
Ranadeep Mukherjee 4 janv. 2016 à 16:38

3 réponses

Meilleure réponse

Ce que j'ai vu avec l'argent est plus fiable que le nombre décimal. Voici un autre exemple.

Pourquoi diable décimal considère 3 / 1,5 comme 1,5, je ne sais pas !!!

declare @real real = 1.5, @realup money=3
select @realUp numerator, @real denominator, @realup /cast (@real as money) money, @realup /cast(@real as decimal) decimal

--numerator denominator money   decimal
--3.00      1.5         2.00    1.50000000000000000000000
0
Peter O. 8 janv. 2016 à 03:16

Cela a à voir avec le type de données "réel" étant un "nombre approximatif", voir https://msdn.microsoft.com/en-us/library/ms173773.aspx. Ma connaissance de SQL n'est pas assez approfondie pour donner une explication détaillée mais j'ai une solution, utilisez le type de données décimal i / o real:

create table #data ( ConditionValue money, ConditionRateNbr decimal(38,20))
              insert into #data values(9665.77,37.61)
              select abs(conditionvalue/conditionrateNbr) Using_Abs ,* 
         from #data

IMO, il est généralement plus intelligent d'utiliser des décimales que des réels pour éviter ce genre de problème.

1
André Kops 4 janv. 2016 à 14:04

En supposant un serveur SQL, mais si vous exécutez le script suivant:

CREATE TABLE #data
(
    ConditionValue MONEY
,   ConditionRateNbr REAL
)
INSERT  INTO #data
VALUES  ( 9665.77, 37.61 )

SELECT  *
INTO data
FROM    (
SELECT  ABS(ConditionValue / ConditionRateNbr) Using_Abs
,       conditionValue / ConditionRateNbr test
,       *
FROM    #data
)a

SELECT * FROM INFORMATION_SCHEMA.COLUMNS AS C WHERE C.TABLE_NAME = 'data'

DROP TABLE #data
DROP TABLE data

Vous verrez que le résultat de la division est un real. Le synonyme ISO de real est float (24). Le {{X1 }} function Renvoie le même type que numeric_expression. Apparemment, le {{ X2}} renvoie une fonction float par défaut, qui est {{X4} }. float(53) contient 15 chiffres, vous obtenez donc 15 chiffres renvoyés.

Ainsi, le type de données renvoyé n'est pas, comme vous pourriez le penser au premier abord, un decimal, mais plutôt un autre float, par défaut à sa taille maximale (pour ainsi dire).

Si vous définissez vos champs comme decimals, consultez ici ce que vous êtes susceptible d'obtenir.

1
HoneyBadger 4 janv. 2016 à 14:38