SQL ABS()在应用于可分割数据时返回意外的小数

时间:2016-01-04 13:38:22

标签: sql

在对可分数数据应用abs时,整数商转换为十进制。

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

为什么会发生这种情况以及如何解决?

3 个答案:

答案 0 :(得分:1)

它与"真实"数据类型为"近似数字",请参阅https://msdn.microsoft.com/en-us/library/ms173773.aspx。我对SQL的了解不够深入,无法给出详细解释,但我确实有一个解决方案,使用十进制数据类型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通常使用小数而不是真实来避免这种问题。

答案 1 :(得分:1)

假设使用sql server,但是如果运行以下脚本:

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

你会看到除法的结果是realThe ISO synonym for real is float(24). ABS(numeric_expression)函数Returns the same type as numeric_expression.显然,ABS函数返回默认floatwhich is float(53)float(53)包含15位数字,因此您返回15位数字。

因此,您最初认为返回的数据类型不是decimal,而是另一个float,默认为其最大大小(可以这么说)。

如果您将字段定义为decimals,请参阅here您可能获得的内容。

答案 2 :(得分:0)

我用钱看到的比十进制更可靠。 这是另一个例子。

为什么地球上的十进制将3 / 1.5视为1.5,我不知道!!!

SELECT