2016-02-05 161 views
-1

損失我不計算精度

BigDecimal a = new BigDecimal(7); 
    BigDecimal b = new BigDecimal(13); 
    BigDecimal c = new BigDecimal(26); 
    System.out.print((a.divide(b)).multiply(c)); 

此代碼生成一個例外:

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. 

這意味着我需要設置RoundingMode

但我需要得到的結果只有沒有損失的精度。

我該如何實現它?

+7

好像。你可以看看有分數類的圖書館,或者自己寫。 –

+0

看看這個:http://commons.apache.org/proper/commons-math/userguide/fraction.html 這裏也有一個討論:http://stackoverflow.com/questions/474535/best-way- to-represent-a-fraction-in-java – mohammedkhan

+0

@大衛華萊士謝謝 - 你是對的 – gstackoverflow

回答

1

看到7/13會變得無窮無盡你所要求的是不可能的。你唯一可能的選擇是在分割時有很高的精度。

0

將7除以13會給你很長且不終止的十進制(0.538461 53846 .....)。所以你需要設置精度限制。試試這個:

a.divide(b, x, RoundingMode.HALF_UP).multiply(c) 

其中x是您想要設置的精度限制。

Javadocs說:

當MathContext對象提供的0 (例如,MathContext.UNLIMITED)時的精度設置,算術運算是準確的,因爲 是其不採取任何算術方法MathContext對象。 (這 是在之前的版本5支持的唯一行爲)

爲了計算準確結果的必然結果,爲0的精度設置一個MathContext對象的舍入模式 設置不 使用,並且因而無關緊要。在除法的情況下,確切商數 可能會有無限長的十進制擴展;例如,1 除以3.

+2

這將解決異常,但提問者需要高精度的數字,這就破壞了目標。 – mohammedkhan