2015-07-11 55 views
0

我知道,不管操作系統,編程語言如何,都存在浮點錯誤。但是,我發現這個例子中沒有不準確的地方。這怎麼可能?我認爲計算需要將stirng轉換爲double,所以應該存在浮點不準確性!BigDecimal如何使浮點不準確?

import java.math.*; 

class NoErrorBigDecimal { 
    public static void main(String[] args) 
    { 
     BigDecimal e1=new BigDecimal("1.6"); 
     BigDecimal e2=new BigDecimal("0.1"); 


     System.out.println("result of add : "+e1.add(e2)); 
     System.out.println("result of multiplication : "+e1.multiply(e2)); 
    } 
} 
+1

浮點數不一定要在IEEE-754格式表示。例如,它們可以作爲BCD數字字符串或ASCII碼或其他方式處理。只要代碼能夠正確處理,就不會有精度損失,並且數字可以隨意變大或變小。 – 2015-07-11 00:14:47

+0

謝謝。我知道了 – Volnyar

+0

'BigDecimal'使用十進制,因此顯然可以表示任何可以用十進制表示的值。它不是二進制浮點類型 –

回答

-2

好了,所以這裏的推論是,雙提供比BigDecimal的更高的精度,或者提供「沒有浮點誤差。」你說的正確的是,每一種編程語言都必須爲四捨五入做出讓步。 Java沒有什麼不同。

相對於其他數字類型,BigDecimal提供了對程序員更大的控制權,並通過大量的構造函數(如BigDecimal(long val,MathContext mc)和舍入模式(例如'ROUND_UP'))進行舍入[請參閱Java 7 API-http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html]。這是處理貨幣時首選BigDecimal的原因。

+1

這是如何回答這個問題的? –

3

BigDecimal如何使浮點不準確?

答案是:不能。

浮點不準確(如你所說)是計算機中使用的實際數字表示的基礎。

爲命題BigDecimal計數器的例子是,1/3的值不能精確使用(對於這個問題或floatdouble)的單個BigDecimal來表示。

  • 它可以精確地使用基-3浮點表示法來表示,但這是不切實際的。它可以精確地由(假設的)任意精度有理數表示表示,但是沒有實現它的標準Java SE類。

另一個反例是Pi(3.14159 ...)。既然是不合理的,它沒有一個有限的數字表示(除了在一種不切實際的感覺,涉及循環邏輯......)


在另一方面,如果你把自己定格,你可以精確地表示數字作爲有限的十進制浮點字符串(如"1.6""0.1"),那麼BigDecimal可以精確地表示所有這些數字...。

我認爲計算需要將stirng轉換爲double,所以應該存在浮點不準確性!

實際上,這並不表示會有不準確的地方。它取決於具體的計算,具體表示和(經常)實際值。例如:

  • 我可以(平凡)實現的計算1/2和(提供的硬件工程)保證該結果將精確地作爲floatdouble來表示。

  • String格式中的十進制數轉換爲BigDecimal不涉及任何可能會導致精度損失的計算。 (如由標準庫實現,並且假設有O(N)可用內存...其中N是輸入字符串長度。)

+0

非常感謝。我對這個問題有了更多的瞭解。 – Volnyar