请教一个SQL四舍五入的问题

a
aegeanboat
楼主 (北美华人网)
我有那么一个计算,算出来的结果是17.74543846….然后我用一个round(n, 2)。期待的结果是17.75。但是SQL给的结果是17.74。请问有谁知道怎么解决?谢谢!
是MS SQL Server。
f
facet
我有那么一个计算,算出来的结果是17.74543846….然后我用一个round(n, 2)。期待的结果是17.75。但是SQL给的结果是17.74。请问有谁知道怎么解决?谢谢!
aegeanboat 发表于 2022-12-03 13:57

Report bug 吧
m
minqidev
改成decimal (n,2) 就可以了
o
oneleaf
round(n+0.005, 2)
g
gokgs
感觉不应该了。
select round(17.74543846, 2); 输出啥?
a
aegeanboat
改成decimal (n,2) 就可以了
minqidev 发表于 2022-12-03 14:06

是cast一下吗?如果是的话,试了,没区别。
a
aegeanboat
round(n+0.005, 2)
oneleaf 发表于 2022-12-03 14:08

那我其他的计算不就给影响了。
a
aegeanboat
感觉不应该了。
select round(17.74543846, 2); 输出啥?
gokgs 发表于 2022-12-03 14:09

如果是数字结果的话就可以round up。但是把公式放在round里面就出错。
g
gokgs
如果是数字结果的话就可以round up。但是把公式放在round里面就出错。
aegeanboat 发表于 2022-12-03 14:14

还是你的数据出错了阿, round 这么多人用, 不可能出错的阿。
这就是 调试程序的步骤, round 没错, 就是你的输入错了呗。
a
aegeanboat
还是你的数据出错了阿, round 这么多人用, 不可能出错的阿。
这就是 调试程序的步骤, round 没错, 就是你的输入错了呗。
gokgs 发表于 2022-12-03 14:19

你看我如果是select a*b,那结果就是1.745386。 我如果就在这个a*b外面套一个变成select round(a*b,2),结果就变1.74。script区别就是这么一点。有人遇到过这种情况吗?我隐隐觉得是sql 什么东西需要clear cache 还是啥的,但不确定。
u
usayso
你的公式在round之前就输出了.74,别冤枉round了
o
oneleaf
回复 7楼aegeanboat的帖子
这个让最后结果,n, 四舍五入到小数点两位,不影响中间结果
a
aegeanboat
回复 7楼aegeanboat的帖子
这个让最后结果,n, 四舍五入到小数点两位,不影响中间结果
oneleaf 发表于 2022-12-03 14:28

那我如果有另外一个计算的结果是17.742386,本来round down应该是17.74。结果这么一加再roundup,不就变成17.75了?
a
aegeanboat
你的公式在round之前就输出了.74,别冤枉round了
usayso 发表于 2022-12-03 14:27

要不就是我没看懂你在说什么,要么就是你没看懂我在说什么。
g
gokgs
你看我如果是select a*b,那结果就是1.745386。 我如果就在这个a*b外面套一个变成select round(a*b,2),结果就变1.74。script区别就是这么一点。有人遇到过这种情况吗?我隐隐觉得是sql 什么东西需要clear cache 还是啥的,但不确定。
aegeanboat 发表于 2022-12-03 14:26

上 screenshot.
o
oneleaf
17.742386 + 0.005 = 17.747386 , round (17.747386 , 2) = 17.74 17.74543846 + 0.005 = 17.75043846, round(17.75043846, 2) = 17.75
a
aegeanboat
17.742386 + 0.005 = 17.747386 , round (17.747386 , 2) = 17.74 17.74543846 + 0.005 = 17.75043846, round(17.75043846, 2) = 17.75
oneleaf 发表于 2022-12-03 14:40

问题是round不总是round down啊。
我之前说过如果round里面是数字不是公式的话,就会roundup出正确结果。
我现在担心的是sql 有时候出正确结果有时候出错误结果。希望找出可能的原因来避免错误结果的出现。
a
aegeanboat
上 screenshot.
gokgs 发表于 2022-12-03 14:39

那肯定是不行啊。公司的政策还是要注意的。 总之区别就是在那个公式外面套了个round(n, 2)
h
hijklmn
你试试select a*b as c,round(a*b,2) as c1
t
timeflies2015
你要不要加个calculated 再 round
g
gokgs
那肯定是不行啊。公司的政策还是要注意的。 总之区别就是在那个公式外面套了个round(n, 2)
aegeanboat 发表于 2022-12-03 14:50

当然不是让你把所有东西都 post 出来阿。
b
bye2020
round(n, 2, 0)
a
aegeanboat
你试试select a*b as c,round(a*b,2) as c1
hijklmn 发表于 2022-12-03 14:55

还是一个出float 17.745…..,另一个出17.74。
a
aegeanboat
你要不要加个calculated 再 round
timeflies2015 发表于 2022-12-03 15:00

试了在这个subquery外面再套一个query再round,还是不行。我现在越来越觉得是server方面出了问题。需要dbcc清除一下cached execution plan。
a
aegeanboat
round(n, 2, 0)
bye2020 发表于 2022-12-03 15:07

Round(n,2)不就是round(n,2,0)吗?
h
hellosmallworld
如果是数字结果的话就可以round up。但是把公式放在round里面就出错。
aegeanboat 发表于 2022-12-03 14:14

那应该还是公式的问题。确定公式单独输出数值是对的吗?
e
eve2ada
有意思,Google了一下,看到一个Example,提供了一些思路。 可能不知道在什么地方做了DECLARE把你的公式计算结果定义为一个什么data format,比如decimal(3,1),类似下面的@value然后ROUND做出的判断就跟下面的example一样有点反常识。 DECLARE @value int SET @value = 16.999999 SELECT ROUND(@value, 1) -- 16 - No rounding with no digits right of the decimal point i.e. int
g
gokgs
有意思,Google了一下,看到一个Example,提供了一些思路。 可能不知道在什么地方做了DECLARE把你的公式计算结果定义为一个什么data format,比如decimal(3,1),类似下面的@value然后ROUND做出的判断就跟下面的example一样有点反常识。 DECLARE @value int SET @value = 16.999999 SELECT ROUND(@value, 1) -- 16 - No rounding with no digits right of the decimal point i.e. int

eve2ada 发表于 2022-12-03 16:03

这个例子里value 是整数,16。
g
gokgs
试了在这个subquery外面再套一个query再round,还是不行。我现在越来越觉得是server方面出了问题。需要dbcc清除一下cached execution plan。
aegeanboat 发表于 2022-12-03 15:13

只能把前面的值一个个打印岀来看。我也不清楚,大概要用中间变量?
或者一步一步重头来,每一步至少运行三遍,正确后再进行下一步。
Round(n,3) 结果是是什么?
_
_summerdays
你公式输出的结果format是什么?
b
bye2020
很久没用sql了,隐约记得遇到过这个问题,是它运算过程中浮点的问题,某个format只运算多少位,好像要先format一下然后再round。周一开电脑找找。
c
cindyela
round不背锅,一定是数据或者你的算法有问题。 最保险的办法,你select两次
with tmp as (select a*b as c from table)
select round(c, 2) as result from tmp