Maison > Questions et réponses > le corps du texte
1.为什么不是1.51?输出的是1.50
2.decimalformat括号里的字符串代表了什么意思?有模板吗?如果是别的格式应该怎么写
3.为什么要用#号而不是0.00?如果是#好的话,当a是0.505的时候有bug
double a =1.505;
BigDecimal bd = new BigDecimal(a);
System.out.println(new DecimalFormat("#.00").format(bd));
高洛峰2017-04-18 10:53:52
Tout d'abord, signalez un problème : lors de la construction de BigDecimal
, essayez de ne pas utiliser de nombres à virgule flottante (double
, float
), car il y a un manque de précision dans le stockage des nombres à virgule flottante dans l'ordinateur. Par exemple, le code que vous avez écrit :
public static void main(String[] args) throws Exception {
double a = 1.505;
BigDecimal bd = new BigDecimal(a);
System.out.println("bd: " + bd.toString());
}
Résultat de l'exécution :
Comme vous pouvez le constater, le nombre à virgule flottante 1,505 ne peut pas être stocké dans l'ordinateur - si vous ne connaissez pas la raison spécifique, veuillez la rechercher vous-même "Le problème de la précision manquante des nombres à virgule flottante"
Deuxièmement, si vous devez sortir 1,51, qui est souvent appelé « arrondi », alors vous devez spécifier le mode d'arrondi de DecimalFormat
:
public static void main(String[] args) throws Exception {
BigDecimal bd = new BigDecimal("1.505");
System.out.println("bd: " + bd.toString());
DecimalFormat df = new DecimalFormat("#.00");
df.setRoundingMode(RoundingMode.HALF_UP);
System.out.println("format: " + df.format(bd));
}
Résultat de l'exécution :
Si vous ne comprenez pas l'utilisation de RoundingMode
, veuillez rechercher "Utilisation du mode d'arrondi"
Troisièmement, concernant la signification des chaînes entre parenthèses DecimalFormat
, veuillez rechercher "Utilisation de DecimalFormat"
伊谢尔伦2017-04-18 10:53:52
System.out.println(String.format("%.2f", a));
System.out.println(new Formatter().format("%.2f", a));
这两种是可以的。
double d = 5.505;
System.out.println(d)
输出的是1.504xxxxxxxxx,所以java在做四舍五入的时候舍掉了后面的4xxxxxx。
等待大神解答