SQL中的计算 - Oracle

问题描述 投票:0回答:3

我在sqldeveloper上执行以下Oracle select:

select  (2299) / (((2299) * 20 )/ (100 * 360)) from dual;

它给了我

1800.000000000000000000000000000000000003

结果而不是1800,为什么呢?我该如何解决?

sql oracle10g calculation
3个回答
0
投票

在这些类型的操作中,复杂的乘法和除法使得错误的答案非常小,就像这里的0.0000000000000003并且在数据库相关操作中非常常见,我遇到了同样的错误并且在两个步骤中简化了操作我的解决方案。


0
投票

如果要忽略所看到的舍入误差,可以将计算值舍入到较小的小数位数:

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

0
投票

未定义数据类型时,无法指定精度。

您可以转换结果或使用TRUNC功能

SELECT CAST ((2299) / (((2299) * 20 )/ (100 * 360))AS INT) FROM dual
© www.soinside.com 2019 - 2024. All rights reserved.