【发布时间】:2016-06-14 22:07:37
【问题描述】:
我们需要四舍五入以下号码:
28.854623
所以,“预期”的步骤是:
1) 28.854623
2) 28.85462
3) 28.8546
4) 28.855
5) 28.86
但是,ROUND 函数的结果似乎是错误的:
SELECT ROUND(28.854623, 2) FROM DUAL;
Result> 28.85
如果我们执行 3 位小数,结果如预期:
SELECT ROUND(28.854623, 3) FROM DUAL;
Result> 28.855
如果我们 ROUND 到 3 个地方,然后到 2 个地方,结果也是预期的:
SELECT ROUND (ROUND (28.854623, 3), 2) FROM DUAL
Result> 28.86
谁能解释我为什么会出现这种行为? ROUND 函数不是在 (N+1) 小数位上创建 TRUNC,然后对结果进行四舍五入,如下所示:
ROUND(TRUNC(VALUE, N+1), N)
谢谢!
【问题讨论】:
-
The documentation explains the algorithm used。它正在做它应该做的事情。您确定要/需要使用非传统方法吗?
-
为什么这个标签是 Java 和 BigDecimal?我已经删除了这些标签 - 如果它们对您很重要,请重新编辑它们(并解释原因)。
-
通常舍入的目的是减少精度位数,同时最小化引入的总体误差。您的迭代舍入方法会引入更大的总体误差而没有任何好处。