Почему Java BigDecimal возвращает 1E + 1? - PullRequest
25 голосов
/ 29 мая 2009

Почему этот код иногда возвращает 1E + 1, в то время как для других входных данных (например, 17) выходные данные не печатаются в научной записи?

BigDecimal bigDecimal = BigDecimal.valueOf(doubleValue).multiply(BigDecimal.valueOf(100d)).stripTrailingZeros();
System.out.println("value: " + bigDecimal);

Ответы [ 4 ]

41 голосов
/ 29 мая 2009

использовать 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());

выходы:

plain      : 10000000
scientific : 10E+6
7 голосов
/ 29 мая 2009

Это неявное .toString() преобразование, которое происходит, когда вы передаете результат в System.out.println().

3 голосов
/ 29 мая 2009

Это в основном потому, что у вас недостаточно значащих цифр. Если вы умножаете что-то, что имеет только 1 значащую цифру на 100, то вы получаете что-то только с 1 значащей цифрой. Если он показывает «10», то это в основном говорит о том, что он имеет 2 значащие цифры. Чтобы показать, что он имеет только 1 значащую цифру, нужно показать "1 x 10 ^ 1".

Следующие два знака после запятой имеют одинаковое значение (10), но разные «масштабы» (где они начинают считать значащие цифры; в верхней части есть 2 сиг-фига, в нижней - 1):

System.out.println(new BigDecimal(BigInteger.TEN, 0));  // prints 10
System.out.println(new BigDecimal(BigInteger.ONE, -1)); // prints 1E+1
3 голосов
/ 29 мая 2009

Точное обоснование поведения BigDecimal.toString() объясняется в API doc с большой (и почти непонятной) подробностью.

Чтобы получить согласованное (и чувствительное к локали) текстовое представление, вы должны использовать DecimalFormat .

...