我在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
??
答案 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在这种情况下会失去精确度,我不确定。