2012-05-24 5 views
25

Ich möchte Maßstab von zwei BigDecimal Zahlen a und b setzen. wie in diesem Beispiel:Runden erforderlich mit BigDecimal Zahlen

BigDecimal a = new BigDecimal("2.6E-1095"); 
     BigDecimal b = new BigDecimal("2.7E-1105"); 
     int i = 112, j=1; 

     BigDecimal aa = a.setScale(i+j); 
     BigDecimal bb = b.setScale(i+j); 

und wenn ich laufe, ich habe diese Ausnahme:

java.lang.ArithmeticException: Rounding necessary 
    at java.math.BigDecimal.divideAndRound(BigDecimal.java:1439) 
    at java.math.BigDecimal.setScale(BigDecimal.java:2394) 
    at java.math.BigDecimal.setScale(BigDecimal.java:2437) 

Warum Rundung notwendig ist? Wenn ich nicht herumkommen möchte, was ist bitte Lösung?

Dank

+0

der Tat ist es eine Überraschung. Ohne auf Docs zu schauen, erwartete ich, dass die Skala auf der Skala abgeschnitten wird ... –

Antwort

26

Sie haben zwei BigDecimal Zahlen von denen beide über 1000 Plätze dezimal erfordern. Wenn Sie versuchen, die Skalierung auf 113 Dezimalstellen zu setzen, bedeutet dies, dass Sie die Präzision verlieren und daher runden müssen.

Sie können die setScale-Methoden verwenden, die einen RoundingMode verwenden, um die Ausnahme, aber nicht die Rundung zu verhindern.

4

Rundung ist notwendig.

In javadoc for BigDecimal, sagt es BigDecimal dargestellt wird als (10 x unscaledValue -Skala), wobei eine unscaledValue arbitatrily lange Ganzzahl ist und das Ausmaß ist eine 32-Bit-Ganzzahl.

2.6 * 10 -1095 erfordert eine Skala von mindestens 1096, um genau darzustellen. Es kann nicht genau mit (irgendeiner ganzen Zahl) * 10 -113 dargestellt werden. Daher müssen Sie eine roundingMode bereitstellen.

5

Versuchen Sie den roudingMode der Methode setScale zu verwenden.

Manche Dinge wie:

BigDecimal aa = a.setScale(i+j, BigDecimal.ROUND_HALF_DOWN);