Формат дробного процента в Java приводит к очень странному поведению - PullRequest
1 голос
/ 13 февраля 2012

Я пытаюсь отформатировать проценты с помощью следующего кода:

NumberFormat fmt = NumberFormat.getPercentInstance();
fmt.setRoundingMode(RoundingMode.HALF_UP);
fmt.setMinimumFractionDigits(0);
fmt.setMaximumFractionDigits(0);
System.out.println(fmt.format(0.145));

Однако я получаю очень странный результат:

14%

Изменение значения 0,145 на другое значение, например 0,125, будет работать правильно, и результат будет таким, как ожидалось

13%

Может кто-нибудь пролить свет на это?Заранее спасибо

Ответы [ 3 ]

1 голос
/ 13 февраля 2012

Я думаю, что это результат внутреннего представления чисел с плавающей точкой. (Десятичные числа, представленные двоичными числами).

Ваш 0,145 может быть внутренне представлен как 0,144999999999 ..., поэтому режим округления округляется вниз.

1 голос
/ 13 февраля 2012

Вы должны прочитать Что должен знать каждый компьютерный ученый об арифметике с плавающей точкой , но в основном это сводится к тому, что .145 не может быть точно представлено в IEEE с плавающей точкой, и поэтому округляетсядо ближайшего значения, которое может быть представлено, которое оказывается немного меньше, чем .145, поэтому оно округляется до двух цифр.

1 голос
/ 13 февраля 2012

Это связано с внутренней ошибкой округления в double, в результате чего 0.145 округляется до

0.1449999999999999900079927783735911361873149871826171875

Используйте BigDecimal, если ожидаете идеальной точности.

...