Oracle 中的舍入不一致
Inconsistent rounding in Oracle
我在Oracle DB 10g (10.2.0.4.0 64bit)中计算了一笔金额,但有些数字我不明白是怎么计算的
设置一个
10000 * (1 / 30) = 333.333*
15600 * (8 / 15) = 8319.999*
设置二
7800 * (1 / 30) = 260*
23400 * (5 / 6) = 19500*
根据第一组,我预计第二组的计算结果为 259.9 和 19499.9,与实际结果不同。
如果 260 和 19500 是第二组的正确结果,我认为 15600 * (8 / 15)
应该是 8320。
我在 SQL 中这样做,例如:
select 15600 * (8 / 15) from dual
如果您看到这个,那么它似乎是 10g 中的错误:
12c没问题
SQL> select banner from v$version where banner like 'Oracle%';
BANNER
--------------------------------------------------------------
Oracle Database 12c Release 12.1.0.1.0 - 64bit Production
SQL> select 15600 * (8 / 15) from dual;
15600*(8/15)
------------
8320
和 11.2
SQL> select banner from v$version where banner like 'Oracle%';
BANNER
--------------------------------------------------------------
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
SQL> select 15600 * (8 / 15) from dual;
15600*(8/15)
------------
8320
SQL>
Oracle's operator order of precendence 将加法和减法放在乘法和除法之前。所以,我希望这些解决方案如下:
10000 x (1 / 30) = 10000 x 0.03333* = 333.333*
15600 x (8 / 15) = 15600 x 0.5333* = 8320
7800 x (1 / 30) = 7800 x 0.03333* = 260
23400 x (5 / 6) = 23400 x 0.833333* = 19500
我不同意 ,因为 11.2 和 12 的结果暗示 Oracle 10 没有 "rounding" 正确启动,如果客户有错,我会期望更少的舍入不是更多
我在Oracle DB 10g (10.2.0.4.0 64bit)中计算了一笔金额,但有些数字我不明白是怎么计算的
设置一个
10000 * (1 / 30) = 333.333*
15600 * (8 / 15) = 8319.999*
设置二
7800 * (1 / 30) = 260*
23400 * (5 / 6) = 19500*
根据第一组,我预计第二组的计算结果为 259.9 和 19499.9,与实际结果不同。
如果 260 和 19500 是第二组的正确结果,我认为 15600 * (8 / 15)
应该是 8320。
我在 SQL 中这样做,例如:
select 15600 * (8 / 15) from dual
如果您看到这个,那么它似乎是 10g 中的错误:
12c没问题
SQL> select banner from v$version where banner like 'Oracle%';
BANNER
--------------------------------------------------------------
Oracle Database 12c Release 12.1.0.1.0 - 64bit Production
SQL> select 15600 * (8 / 15) from dual;
15600*(8/15)
------------
8320
和 11.2
SQL> select banner from v$version where banner like 'Oracle%';
BANNER
--------------------------------------------------------------
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
SQL> select 15600 * (8 / 15) from dual;
15600*(8/15)
------------
8320
SQL>
Oracle's operator order of precendence 将加法和减法放在乘法和除法之前。所以,我希望这些解决方案如下:
10000 x (1 / 30) = 10000 x 0.03333* = 333.333*
15600 x (8 / 15) = 15600 x 0.5333* = 8320
7800 x (1 / 30) = 7800 x 0.03333* = 260
23400 x (5 / 6) = 23400 x 0.833333* = 19500
我不同意