我在Oracle 11g数据库上运行此SQL语句
select round(79/3 + 87/3 + 86/6 + 95/6) from dual
返回85
85
select round(79/3 + 87/3 + 86/6 + 95/6,1) from dual
返回85.5
85.5
select round(85.5) from dual
返回正确的值86有人知道为什么第一个SQL语句没有返回正确的值86,而是将其舍入为85吗??
86
zdwk9cvp1#
如果您这样做:
select 79/3 + 87/3 + 86/6 + 95/6 from dual;
Oracle将返回85.49999999999999999999999999999999999999,当四舍五入到小数点后0位时,实际上是85。它是浮点运算的产物。
85.49999999999999999999999999999999999999
ldfqzlk82#
79/3 + 87/3 + 86/6 + 95/6将返回浮点运算,它没有IEEE 754的舍入行为。数字和浮点数here的区别为了得到正确的结果,你需要运行以下语句:
select round(to_number(79/3 + 87/3 + 86/6 + 95/6)) from dual;
qxgroojn3#
即使我不知道为什么Oracle正在失去它的精度,但作为一个工作,你可以这样使用它SELECT round(round(79/3 + 87/3 + 86/6 + 95/6,4),0)FROM DUAL
pzfprimi4#
它看起来是一个奇怪的精度损失。
SELECT 79/3 + 87/3 + 86/6 + 95/6 FROM DUAL
85.49999999999999999999999999999999999999显然85.4将四舍五入到85。至于为什么甲骨文在这种情况下失去了精确性,我不确定。
4条答案
按热度按时间zdwk9cvp1#
如果您这样做:
Oracle将返回
85.49999999999999999999999999999999999999
,当四舍五入到小数点后0位时,实际上是85。它是浮点运算的产物。ldfqzlk82#
79/3 + 87/3 + 86/6 + 95/6将返回浮点运算,它没有IEEE 754的舍入行为。数字和浮点数here的区别
为了得到正确的结果,你需要运行以下语句:
qxgroojn3#
即使我不知道为什么Oracle正在失去它的精度,但作为一个工作,你可以这样使用它
SELECT round(round(79/3 + 87/3 + 86/6 + 95/6,4),0)FROM DUAL
pzfprimi4#
它看起来是一个奇怪的精度损失。
85.49999999999999999999999999999999999999
显然85.4将四舍五入到85。至于为什么甲骨文在这种情况下失去了精确性,我不确定。