2016-06-22 4 views
-3

Ich möchte ROUND_UP als Rundungsmodus verwenden. Wenn die Dezimalstellen in der ursprünglichen Zahl jedoch weniger als drei Dezimalstellen sind, wird am Ende "1" angehängt.Problem mit Rundungsmodus in ROUND_UP in Java

int precision = 3; 
    double[] values = { 1.9024999999999999, 2.1234, 2.2835, 2.04 }; 
    for (double value : values) { 
    BigDecimal bd1 = new BigDecimal(value); 
    bd1 = bd1.setScale(precision, BigDecimal.ROUND_UP); 
    System.out.println(value + "===========" + bd1.doubleValue()); 
    } 

Der Ausgang ist, wie unten -

1.9024999999999999===========1.903 

2.1234===========2.124 

2.2835===========2.284 

2.04===========2.041 

Antwort

2

aber wenn die Dezimalzahlen in der ursprünglichen Zahl kleiner als 3 Dezimalzahlen, dann am Ende "1" angehängt wird.

Ihr Wert von 2.04 ist nicht wirklich 2.04. Es ist tatsächlich 2.040000000000000035352713678800500929355621337890625, das ist der double Wert am nächsten zu 2.04. Wenn man das aufruft, wird es korrekt auf 2.041 aufgerundet.

Sie verwenden den BigDecimal(double) Konstruktor, die mit ziemlicher Sicherheit nicht das, was Sie wollen es nicht tun - die documentation für Warnungen über sie zu sehen. Wenn Sie stattdessen BigDecimal.valueOf(double) verwenden, verhält es sich wie erwartet.

Code:

import java.math.BigDecimal; 

public class Test { 
    public static void main(String[] args) { 
     int precision = 3; 
     double[] values = { 1.9024999999999999, 2.1234, 2.2835, 2.04 }; 
     for (double value : values) { 
      BigDecimal bd1 = BigDecimal.valueOf(value); 
      bd1 = bd1.setScale(precision, BigDecimal.ROUND_UP); 
      System.out.println(value + "===========" + bd1.doubleValue()); 
     } 
    } 
} 

Ausgang:.

1.9024999999999999===========1.903 
2.1234===========2.124 
2.2835===========2.284 
2.04===========2.04 
+0

Darf ich fragen, warum der wahre Wert von '2.04' derjenige ist, den Sie sagten? – dabadaba

+0

@dabadaba: Weil das der doppelte Wert für 2.04 ist. Der Wert 2.04 kann im binären Fließkomma nicht genau dargestellt werden. –

+0

Ja, ich könnte das lesen. Ich nehme an, das bedeutet, dass es keine Möglichkeit gibt, einen präzisen '2.04' in Gleitkommazahlen zu speichern. – dabadaba

0

meine Forderung ist -

Original kein ================= gerundete Zahl

1,9024999999999999 =========== 1,903

1.8050000000000002 =========== 1.805

Jetzt, mit der bereitgestellten Lösung, bekomme ich die 1. Nummer korrekt. Aber, nicht die 2. Nummer. Kannst du mir bitte diese Szenarien erklären? Für die zweite Nummer erhalte ich einen Wert von 1.806.