2012-07-09 70 views
2

我在Oracle 11g數據庫甲骨文ROUND函數返回錯誤值

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

運行該SQL語句並返回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 ??

+1

%的文檔,它會舍入到的名額給你指定小數點右側,缺省值爲0。因此,甲骨文並沒有錯,你只是沒有閱讀文檔。所以「正確」的價值取決於你告訴甲骨文要做的事情。 – tbone 2012-07-09 17:34:39

回答

10

如果你這樣做:

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

甲骨文將返回85.49999999999999999999999999999999999999,當其四捨五入到0位小數確實是85.這是浮點運算的神器。

+0

有關詳細信息,請參閱http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – Xophmeister 2012-07-09 15:39:32

+0

謝謝,這非常有幫助。 – mefist 2012-07-09 15:53:45

+0

任何想法如何使ROUND函數正確地將其舍入?我正在考慮這樣的事情**選擇一輪((79/3 + 87/3 + 86/6 + 95/6)+0.000000001)從雙**順便說一句我只對零精度感興趣 – mefist 2012-07-09 16:01:12

-1

它看起來是一個奇怪的精度損失。

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

85.49999999999999999999999999999999999999

顯然將85.4接着一輪85.至於爲何甲骨文失去精度在這種情況下,我不知道。

+0

你可以用計算器來解決問題。 79/3 = 26 1/3,但一個計算器將顯示26.33333333 .. - 當你加起來四個數字,你會得到85.5;當計算器執行它時,它會得到85.499999999 ..因爲它在中間計算中不能準確表示1/3分數。 – 2012-07-12 06:07:09

1

3分之79+3分之87+6分之86+ 95/6將返回不具有IEEE 754的舍入行爲見數之間的差異和浮動here

爲了讓浮點運算正確的結果回到你需要運行該語句爲:

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