Oracle编号路由问题

reg*_*sxp 0 oracle rounding

我们需要Round Half-UP以下NUMBER:

28.854623
Run Code Online (Sandbox Code Playgroud)

所以,'预期'的步骤是:

1) 28.854623
2) 28.85462
3) 28.8546
4) 28.855
5) 28.86
Run Code Online (Sandbox Code Playgroud)

但是,ROUND函数的结果似乎是错误的:

SELECT ROUND(28.854623, 2) FROM DUAL;
Result> 28.85
Run Code Online (Sandbox Code Playgroud)

如果我们以3位小数位执行,结果如预期:

SELECT ROUND(28.854623, 3) FROM DUAL;
Result> 28.855
Run Code Online (Sandbox Code Playgroud)

如果我们ROUND到3个地方,然后到2个地方,结果也是预期的:

SELECT ROUND (ROUND (28.854623, 3), 2) FROM DUAL
Result> 28.86
Run Code Online (Sandbox Code Playgroud)

有谁能解释我为什么会这样做?是不是ROUND函数在(N + 1)十进制位置上产生TRUNC,然后,舍入结果,如下所示:

ROUND(TRUNC(VALUE, N+1), N)
Run Code Online (Sandbox Code Playgroud)

谢谢!

Tyl*_*Lee 6

我见过的没有舍入函数会从最后一个小数开始,然后像那样向后工作.舍入函数将看起来超过所需的十进制计数1个字符(如果找到的第一个字符是5 MT0,则可能会进一步说明如果下一个字符为5,则Oracle从0开始舍入).

在你的例子中,ROUND(28.854623, 2)会看到28.854并说'向下'.行为就像我期望的那样.

如果你想要一个像你所描述的那样循环的函数,你可能需要自己实现一个.