MySQL - 如何将小数总是向上取整?

18

例如,我有以下数值:

0.000018

这是6位小数,但我想将它四舍五入到最接近的第4位小数,以便:

0.000018 -> 0.0001

我尝试了 round() 函数,但如果我简单地使用 round() 函数:

round(0.000018,4) = 0.0000

在处理金融小数时,在这种情况下需要四舍五入并向客户收费,而不是白嫖给他们!但是 round() 函数会根据值向上或向下取整,我需要始终向上取整。

是否有一种简单的方法来实现这个需求?


我不明白你如何期望round(0.000018)得到0.0002? - jman
他不确定,因为四舍五入会上下取整。这就是为什么有一个疑问符的原因 :) - Nanne
抱歉,打错字了...我是指0.0001。已在原问题中更正。 - quidpro
3个回答

34
你可以使用 ceil (ceiling) 函数。它只会将数字向上舍入,因此你需要将其乘以 10000,执行 ceil 操作,然后再次将结果除以 10000。
所以 ceil(0.000145* 10000) = ceil(1.45) = 2 再除回去,你就得到了 0.0002 编辑:等等,什么?这个方法行不通。我的意思是显然要用 FLOOR,但操作方式相同 :D 手册在同一页上 :)
所以 floor(0.000145* 10000) = floor(1.45) = 1 再除回去,你就得到了 0.0001

1
谢谢,我认为ceil()是这里的答案: ceil(0.00000110000)/10000 = 0.0001
ceil(0.000011
10000)/10000 = 0.0001
ceil(0.00011110000)/10000 = 0.0002
ceil(0.000200
10000)/10000 = 0.0002
ceil(0.000201*10000)/10000 = 0.0003
- quidpro

5

还有另一种方法,就是添加一个10的半倍数。例如:round(x+0.005, 2),其中x为0.923 = 0.93,这样可以减少最大浮点除法误差。


MySQL的round函数对于不精确的数字有相当不确定的行为:http://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_round(对于近似值数字,结果取决于C库)。 - Vladislav Rastrusny
当值为x.00时,这段代码会出现错误,它会向上舍入到x.01。 - Anders8

0
使用ROUND(X,D),将值X舍入到小数点后D位。

4
这不会像OP请求的那样四舍五入。ROUND(1.11,1)会变成1.1而不是1.2 - lindon fox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接