2016-08-18 159 views
2

我的問題,簡而言之,爲什麼浮點數的舍入誤差只會在計算後顯示出來,而不是存儲文字?將十進制浮點數轉換爲二進制並返回

我的意思是這個 - 我知道由於從十進制轉換爲二進制和返回時浮動四捨五入誤差引起的問題。

例如,在Java中:然後

double a = 10.567; 
double b = 2.16; 
double c = a * b; 

C存儲,而不是22.82472值22.824720000000003。

這是因爲結果22.82472不能準確地存儲在雙精度型的有限二進制數字中。 然而,10.567和2.16(即a和b)都不是。

但是,如果我打印的a和b的值,他們打印出來,沒有任何舍入誤差。爲什麼舍入錯誤不會顯示在這裏?

這是否意味着浮點文字的表示與浮點計算結果的表示有某種不同?

+0

它的輸出格式化。例如。在C#中''c.ToString()'''c.ToString(「R」)'(''R''強制.Net返回所有位而沒有任何向上取整)時將返回'22.82472''將返回'22.824720000000003' –

+1

@DmitryBychenko我嘗試使用Java格式化c作爲String,它仍然返回22.824720000000003。 –

回答

6

文字轉換中存在四捨五入錯誤,它恰好隱藏在您的面前。 10.567不能以二進制來表示,所以而是舍入到最接近的可表示double值,它是

10.56700000000000017053025658242404460906982421875

然而,而非打印的確切值(這將是相當惱人),算法打印最少可能的數字,如果它被轉換回二進制它會給出相同的值(在這種情況下是「10.567」)。

事實證明,對於double s,您可以對最多15位數的任意小數執行此操作,請參閱http://www.exploringbinary.com/number-of-digits-required-for-round-trip-conversions/

相關問題