Получение неверных результатов из DecimalFormat.format () для больших чисел - PullRequest
0 голосов
/ 10 апреля 2020
val numberFormatter = NumberFormat.getNumberInstance(Locale.getDefault())
val conversionPattern = "#,##0.####"
val decimalFormatter = numberFormatter as DecimalFormat
decimalFormatter.applyPattern(conversionPattern)

decimalFormatter.format("9999999999999999".toDouble()) // Getting -> "10,000,000,000,000,000"
                                                       // Need    ->  "9,999,999,999,999,999"

Что не так? Это переполнение? Я имею дело с действительно большими числами, поэтому я использую BigDecimal для базового значения, но для форматирования его с помощью разделителей группировки нет функции format (), которая принимает BigDecimal. Как я могу отформатировать числа по крайней мере с 20 цифрами?

1 Ответ

2 голосов
/ 10 апреля 2020

Используйте BigDecimal или BigInteger для таких больших чисел. Например:

decimalFormatter.format(new BigDecimal("9999999999999999"))

A double точность чисел с плавающей запятой имеет точность около 15-16 десятичных цифр. Ваш номер имеет 16 девяток. Не существует числа с плавающей запятой двойной точности, точно равного 9999999999999999, поэтому оно округляется до ближайшего - который равен 10 16 .

...