2015-01-10 4 views
6

Nach meinem Verständnis, wenn die Zahl, auf die gerundet wird, zwischen ihren Nachbarn gleich weit auseinander liegt (z. B. 4,5, wenn Sie eine Nachkommastelle runden), runden Sie die vorhergehende Zahl ab zur nächsten geraden Zahl.Half-Even Rounding

Wenn Sie beispielsweise auf 0 Nachkommastellen runden 1.5, 3.5, 5.5, 7.5 und 9.5 werden alle auf 2, 4, 6, 8 und 10 aufgerundet. Das alles funktioniert gut und gut in Netbeans, aber ich stoße auf Probleme, wenn ich auf 1 Stelle nach dem Komma rundet.

package foo; 
import java.text.NumberFormat; 

public class Foo { 
    public static void main(String[] args) { 
     NumberFormat formatter = NumberFormat.getNumberInstance();  
     formatter.setMaximumFractionDigits(1); 
     System.out.print(formatter.format(4.45)); 
    } 
} 

Lauf:

4.5 

BUILD SUCCESSFUL (total time: 0 seconds) 

Ich würde denken, dass dies zusätzlich zu 4.4

abrunden würde, wenn ich 4.55 für die Eingabe in Format verwenden, 4.5 ausgegeben, wo ich erwarten 4,6 Gibt es ein Fehler mit Java oder mit meinem Verständnis?

+0

[s] Sind Sie sicher, Number ist standardmäßig Halb auch? [/ S] macht nichts, es ist. – Arhowk

+0

Ich habe gerade Ihren Code ausgeführt und es gab mir 4.4 – Arhowk

+0

Ich bekomme 4,4. Welche Version von Java verwenden Sie? –

Antwort

4

Ich bin mir nicht sicher, das ist eigentlich technisch ein Fehler.

Das Problem ist, dass, wenn Sie 4.45 schreiben und der Wert wird als double interpretiert, dass auf eine binären Fraktion abgerundet wird: eine Summe von Vielfachen von Potenzen von 2 bis zu einem gewissen Präzision. (Das Runden selbst erfolgt mit HALF_EVEN Runden, aber mit Binärziffern anstelle von Dezimalziffern.)

Dieser gerundete Wert kann leicht über oder etwas unter 4,45 liegen, aber NumberFormat runden den wahren binären Wert, der im Doppel gespeichert ist, nicht ab der Dezimalwert, den Sie geschrieben haben.

Sie können den wahren binären Wert bestimmen Sie tatsächlich durch System.out.println(new BigDecimal(4.45)); Schreiben bekommen, wenn ich das tue, ich 4.45000000000000017763568394002504646778106689453125 bekommen, was der tatsächliche Wert auf 0,1 gerundet werden - das ist definitiv 4.5 sein wird.

1

Es auf ganzzahlige Runden, versuchen Sie diese

formatter.setMaximumFractionDigits(0); 
    System.out.println(formatter.format(4.5)); 
    System.out.println(formatter.format(5.5)); 

Ausgang

4 
6