sql - 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?
解决方案
由于您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 列所示,解决方案是使用更精确的数据类型。
推荐阅读
- sql - SQL 查询以查找 Date、TranscationAmount_US、TransactionAmount_UK
- javascript - Bootstrap 4.2 脚本未加载/工作
- apache-nifi - 如何在 nifi 中为消息添加时间戳?
- javascript - React Native - 在滚动时隐藏键盘
- sql - 如何查询和显示具有相同id,相同日期和相同名字的行结果的最长名称
- mysql - MySQL VIEW,使用先验计算并避免嵌套 VIEW
- c - 如何在c语言中通过索引从字符串中获取char?
- ssrs-2012 - SSRS 表达式更改文本颜色
- bash - 如何通过 bash 脚本向 condor 提交 wget 作业?
- sql - 将 Eloquent 与 LIKE 运算符一起使用