Результирующее ожидаемое значение будет равно 877,85.
Что следует сделать, чтобы обеспечить правильное вычисление?
Переведено автоматически
Ответ 1
Для контроля точности арифметики с плавающей запятой вам следует использовать java.math.BigDecimal. Прочитайте О необходимости BigDecimal Джона Жуковски для получения дополнительной информации.
Учитывая ваш пример, последняя строка будет следующей с использованием BigDecimal .
Как указывалось в предыдущих ответах, это следствие выполнения арифметики с плавающей запятой.
Как предлагалось в предыдущем постере, при выполнении числовых вычислений используйте java.math.BigDecimal.
Однако в использовании есть ошибка BigDecimal. При преобразовании значения double в a BigDecimal у вас есть выбор: использовать новый BigDecimal(double) конструктор или BigDecimal.valueOf(double) статический заводской метод. Используйте статический заводской метод.
Конструктор double преобразует всю точность double в a BigDecimal, в то время как статическая фабрика эффективно преобразует ее в a String, а затем преобразует это в a BigDecimal.
Это становится актуальным, когда вы сталкиваетесь с этими незначительными ошибками округления. Число может отображаться как .585, но внутренне его значение равно '0.58499999999999996447286321199499070644378662109375'. Если бы вы использовали BigDecimal конструктор, вы бы получили число, КОТОРОЕ НЕ равно 0.585, в то время как статический метод выдал бы вам значение, равное 0.585.
двойное значение = 0,585; System.out.println(новый BigDecimal(значение)); System.out.println(BigDecimal.valueOf(значение));
doubled=0; for (inti=1; i <= 10; i++) { d += 0.1; } System.out.println(d); // prints 0.9999999999999999 not 1.0
Use BigDecimal instead.
EDIT:
Also, just to point out this isn't a 'Java' rounding issue. Other languages exhibit similar (though not necessarily consistent) behaviour. Java at least guarantees consistent behaviour in this regard.