我在 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
?
如果你这样做:
select 79/3 + 87/3 + 86/6 + 95/6 from dual;
Oracle 将返回85.49999999999999999999999999999999999999
,四舍五入到小数点后 0 位确实是 85。它是浮点运算的产物。
79/3 + 87/3 + 86/6 + 95/6 将返回不具有 IEEE 754 舍入行为的浮点运算。请参阅此处Number 和 Float 之间的区别
要获得正确的结果,您需要将语句运行为:
select round(to_number(79/3 + 87/3 + 86/6 + 95/6)) from dual;
这看起来是一种奇怪的精度损失。
SELECT 79/3 + 87/3 + 86/6 + 95/6 FROM DUAL
85.49999999999999999999999999999999999999
显然 85.4 会四舍五入到 85。至于为什么 Oracle 在这种情况下会失去精度,我不确定。