首页 > 解决方案 > sql中的舍入错误

问题描述

DECLARE @TAX VARCHAR(30)=120.45
DECLARE @TaxRoundOf VARCHAR(30)
SET @TaxRoundOf=ROUND(@TAX,1)
SELECT @TaxRoundOf

这给出了结果(@TaxRoundOf=120.5)

DECLARE @TAX VARCHAR(30)=146.45
DECLARE @TaxRoundOf VARCHAR(30)
SET @TaxRoundOf=ROUND(@TAX,1)
SELECT @TaxRoundOf

这给出了结果(@TaxRoundOf=146.4)

但我需要返回146.50。为什么这两个结果之间不匹配?任何人都可以帮助PLZ?

标签: sqlsql-server-2008

解决方案


由于您VARCHAR用于存储数字,SQL Server 必须进行隐式转换以在幕后浮动,这会对您的计算产生影响。您可以使用以下查询重现此情况:

SELECT  ROUND(CONVERT(FLOAT, 120.45),1),            -- 120.5
        ROUND(CONVERT(FLOAT, 146.45),1),            -- 146.4
        ROUND(CONVERT(DECIMAL(10, 2), 120.45),1),   -- 120.50
        ROUND(CONVERT(DECIMAL(10, 2), 146.45),1)    -- 146.50

由于浮点数不精确,因此 146.45 不能精确地表示为浮点数,并且最终被存储为一个非常小的数字,因此当将其传递给 round 函数时,它会向下舍入,而不是向上舍入。

如上述查询中的第 3 列和第 4 列所示,解决方案是使用更精确的数据类型。


推荐阅读