Java - Arrondissez à deux décimales en fonction de la troisième valeur décimale [dupliquer]
Dec 16 2020
Je suis assis là-dessus depuis un jour maintenant en pensant comme un élève de 5e année.
public class Tester
{
static String actualValue = "";
private static DecimalFormat df2 = new DecimalFormat("#.##"); //To round off to two decimal places.
static double regPrice = 0.0;
static double regPrice2 = 0.0;
public static void main(String[] args)
{
regPrice2 = 1506.365;
System.out.println("reg price 1 is: "+regPrice2);
System.out.println("reg price 1 after rounding is is: "+round(regPrice2));
regPrice = 8535.765;
System.out.println("reg price is: "+regPrice);
System.out.println("reg price after rounding is: "+round(regPrice));
}
public static double round(double value)
{
df2.setRoundingMode(RoundingMode.HALF_UP);
String returnValue = df2.format(value);
double actualValue = Double.parseDouble(returnValue);
return actualValue;
}
}
Production | Valeur 1 | Valeur 2 |
---|---|---|
Réel | 1506,37 | 8535. 76 |
Attendu | 1506,37 | 8535. 77 |
Pourquoi l'arrondissement fonctionne-t-il pour le premier nombre mais pas pour le second? Comment puis-je faire fonctionner cela?
Réponses
1 TomášZáluský Dec 16 2020 at 07:51
Grâce à la représentation en virgule flottante, ce que vous pensez 1506,365 ou 8535,765 est en fait un nombre légèrement supérieur ou inférieur à ce que vous attendez. Les nombres à virgule flottante sont représentés par la mantisse et l'exposant. Par exemple, pour 0,365 et 0,765, l'arrondi est effectué différemment. Arrondir près des moitiés apparaît alors comme dans une direction aléatoire. À utiliser BigDecimal
si vous avez besoin d'un nombre précis.