Pourquoi Java BIGDECIMAL retour 1E + 1?
-
06-09-2019 - |
Question
Pourquoi ce code parfois revenir 1E + 1 tandis que pour d'autres entrées (par exemple 17), la sortie ne soit pas imprimé en notation scientifique?
BigDecimal bigDecimal = BigDecimal.valueOf(doubleValue).multiply(BigDecimal.valueOf(100d)).stripTrailingZeros();
System.out.println("value: " + bigDecimal);
La solution
BigDecimal bigDecimal = BigDecimal.valueOf(100000.0)
.multiply(BigDecimal.valueOf(100d))
.stripTrailingZeros();
System.out.println("plain : " + bigDecimal.toPlainString());
System.out.println("scientific : " + bigDecimal.toEngineeringString());
sorties:
plain : 10000000 scientific : 10E+6
Autres conseils
Il est la conversion de .toString()
implicite qui se passe lorsque vous passez le résultat dans System.out.println()
.
La raison exacte du comportement de BigDecimal.toString()
est expliqué dans le API doc en grande (et près incompréhensible) détail.
Pour obtenir une représentation textuelle cohérente (et paramètres régionaux), vous devez utiliser DecimalFormat .
Il est essentiellement parce que vous n'avez pas assez de chiffres significatifs. Si vous multipliez quelque chose qui a seulement 1 chiffre significatif avec 100, alors vous obtenez quelque chose avec seulement 1 chiffre significatif. Si elle montre « 10 », puis qui dit essentiellement qu'il a 2 chiffres significatifs. La façon de montrer qu'il a seulement 1 chiffre significatif est de montrer « 1 x 10 ^ 1 ».
Les deux décimales ont la même valeur (10), mais différentes « échelles » suivantes (où ils commencent à compter les chiffres significatifs, la partie supérieure a 2 figues sig, le fond a 1):
System.out.println(new BigDecimal(BigInteger.TEN, 0)); // prints 10
System.out.println(new BigDecimal(BigInteger.ONE, -1)); // prints 1E+1