2017-03-24 6 views
1

Ich bekomme ein unerwartetes Ergebnis, wenn ich versuche, String 12345678911234567 zu verdoppeln. verwende ich den Code wie untenDecimalFormat Doppelfehler analysieren, wenn Nummer über 1234567891123456

double convertedNum = 0; 
convertedNum = new DecimalFormat().parse(12345678911234567).doubleValue(); 

das konvertierte Ergebnis war 1.2345678911234568E16 aber ich erwartete es war 1.2345678911234567E16, und ich versuche auch BigDecimal zu verwenden, wie unten

double convertedNum = 0; 
BigDecimal bgNum = null; 
bgNum = new BigDecimal(12345678911234567); 
convertedNum = bgNum.doubleValue(); 

erhalten gleiche zu konvertieren Ergebnis, ich kann nicht finden, was das verursacht. Würde mir jemand vorschlagen können, danke.

Antwort

0

Meine beste Empfehlung ist die Zahl in Anführungszeichen in dem BigDecimal Konstruktor setzen - wie

new BigDecimal("12345678911234567"); 

Konstruktor BigDecimal mit einem String Argumente kann mit Zahlen von (fast) jede vernünftigen Größe behandeln.

Nicht alle großen Zahlen können korrekt in einem double gespeichert werden. Es scheint, dass die Zahl, die Sie darstellen möchten, zwischen zwei double Werten liegen kann. Aber BigDecimal wird sicherlich in der Lage sein, es richtig darzustellen.

aktualisieren

Zu meinem letzten Absatz zu klären, gibt es keine double gleich 12345678911234567. Es gibt eine double gleich 12345678911234566, aber die nächste double ist gleich 12345678911234568. Jeder Versuch, 12345678911234567 in einem double zu speichern, führt zu einer Rundung auf 12345678911234568.

+0

Danke für Ihre Antwort, aber ich muss doppelt gespeichert werden. Also verwende ich BigDecimal doubleValue(), um zu analysieren, aber das Ergebnis ist auch 1.2345678911234568E16. – kingaffery

+0

@kingaffery Ich hoffe, mein Update erklärt, warum das, wonach Sie fragen, unmöglich ist. –

Verwandte Themen