Oracle ROUND函数返回错误的值

时间:2012-07-09 15:29:36

标签: sql oracle oracle11g

我在Oracle 11g数据库上运行这个sql语句

select round(79/3 + 87/3 + 86/6 + 95/6) from dual

然后返回85

select round(79/3 + 87/3 + 86/6 + 95/6,1) from dual

返回85.5

select round(85.5) from dual

返回正确的值86

有没有人知道为什么第一个SQL语句没有返回正确的值86,但它将其四舍五入为85 ??

3 个答案:

答案 0 :(得分:10)

如果你这样做:

select 79/3 + 87/3 + 86/6 + 95/6 from dual;

Oracle将返回85.49999999999999999999999999999999999999,当舍入到0小数位时确实是85.这是浮点运算的一个人为因素。

答案 1 :(得分:1)

79/3 + 87/3 + 86/6 + 95/6将返回浮点运算,该运算没有IEEE 754的舍入行为。请参阅Number和Float here之间的差异

要获得正确的结果,您需要将语句运行为:

select round(to_number(79/3 + 87/3 + 86/6 + 95/6)) from dual;

答案 2 :(得分:-1)

这似乎是一种奇怪的精确度损失。

SELECT 79/3 + 87/3 + 86/6 + 95/6 FROM DUAL

85.49999999999999999999999999999999999999

显然85.4将会转到85.至于为什么Oracle在这种情况下会失去精确度,我不确定。