2

我在 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

4

3 回答 3

10

如果你这样做:

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

Oracle 将返回85.49999999999999999999999999999999999999,四舍五入到小数点后 0 位确实是 85。它是浮点运算的产物。

于 2012-07-09T15:37:15.300 回答
1

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;
于 2012-07-09T22:43:20.933 回答
-1

这看起来是一种奇怪的精度损失。

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

85.49999999999999999999999999999999999999

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

于 2012-07-09T15:40:56.003 回答