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);
Était-ce utile?

La solution

bigDecimal.toPlainString () :

 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top