在对可分数数据应用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
为什么会发生这种情况以及如何解决?
答案 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
你会看到除法的结果是real
。 The ISO synonym for real is float(24). ABS(numeric_expression)
函数Returns the same type as numeric_expression.显然,ABS
函数返回默认float
,which is float(53)
。 float(53)
包含15位数字,因此您返回15位数字。
因此,您最初认为返回的数据类型不是decimal
,而是另一个float
,默认为其最大大小(可以这么说)。
如果您将字段定义为decimals
,请参阅here您可能获得的内容。
答案 2 :(得分:0)
我用钱看到的比十进制更可靠。 这是另一个例子。
为什么地球上的十进制将3 / 1.5视为1.5,我不知道!!!
SELECT