我在sqldeveloper上执行以下Oracle select:
select (2299) / (((2299) * 20 )/ (100 * 360)) from dual;
它给了我
1800.000000000000000000000000000000000003
结果而不是1800,为什么呢?我该如何解决?
在这些类型的操作中,复杂的乘法和除法使得错误的答案非常小,就像这里的0.0000000000000003并且在数据库相关操作中非常常见,我遇到了同样的错误并且在两个步骤中简化了操作我的解决方案。
如果要忽略所看到的舍入误差,可以将计算值舍入到较小的小数位数:
set numf 9999.999999999999999999999999999999999999
select (2299) / (((2299) * 20 )/ (100 * 360)) from dual;
(2299)/(((2299)*20)/(100*360))
-----------------------------------------
1800.000000000000000000000000000000000003
select round((2299) / (((2299) * 20 )/ (100 * 360)), 35) from dual;
ROUND((2299)/(((2299)*20)/(100*360)),35)
-----------------------------------------
1800.000000000000000000000000000000000000
(由于我为显示指定的数字格式,现在仅显示尾随零)。
你也可以,至少在这种情况下,通过使用二进制算法来消除它,但我不确定这通常是个好主意:
select cast (2299 as binary_double) / (((2299) * 20 )/ (100 * 360)) from dual;
CAST(2299ASBINARY_DOUBLE)/(((2299)*20)/(100*360))
-------------------------------------------------
1.8E+003
未定义数据类型时,无法指定精度。
您可以转换结果或使用TRUNC功能
SELECT CAST ((2299) / (((2299) * 20 )/ (100 * 360))AS INT) FROM dual