2016-11-21 4 views
1

Ich versuche, auf 1 Dezimalstelle zu runden. Unten ist das Code-Snippet.DecimalFormat gibt kein Ergebnis nach Half_Even Rundung

DecimalFormat decimalFormat = new DecimalFormat("#0.#"); 
String formattedNumber = decimalFormat.format(4.65d); 
System.out.println(formattedNumber); 

Output
4,7

Wie pro DecimalFormat Javadoc- ist seine Standardrundungs ​​HALF_EVEN. Nach dieser Regel sollte 4,65 auf 4,6 gerundet worden sein. Aber es gibt Ausgabe als 4.7. Bitte hilf mir, dieses Verhalten zu verstehen.

+0

@ChiragParmar Dies ist kein Duplikat. Die andere Frage betrifft das Verständnis von Grundlagen von HALF_EVEN, das ist nicht der Zweck dieser Frage. Vielmehr diskutieren wir den Grund des unerwarteten Verhaltens, das während des Rundens in dem erwähnten Fall gezeigt wurde, das in der anderen von Ihnen gestellten Frage nicht beantwortet wird. – sky

Antwort

3

Ein Double hat einen kleinen Darstellungsfehler für viele Dezimalwerte, einschließlich 4,65, was tatsächlich etwas höher ist, als es erscheint.

System.out.println(new BigDecimal(4.65)); 

druckt

4.6500000000000003552713678800500929355621337890625 
+0

Danke für Ihre Antwort. Können Sie Lesematerial bereitstellen, um mehr über diese Fehlerdarstellung in einigen Dezimalwerten zu erfahren? Ist es spezifisch für Java? – sky

+1

@sky es ist das gleiche Problem für alle IEEE 754-Standardimplementierungen. Google für Links zu diesem Thema. Die Hälfte bedeutet gar nicht viel, außer der Wert als genaue Darstellung. –

1

Neben Peters Lawrey beantworten Sie BigDecimal(String val), um sicherzustellen, das Bestehen der genaue Wert decimalFormat.format() Methode zu übergeben könnten versuchen:

String formattedNumber = decimalFormat.format(new BigDecimal("4.65")); 
System.out.println(formattedNumber); 

erhalten Sie eine Ausgabe von Get 4.6.

Verwandte Themen