Я хочу напечатать числа в диапазоне от 0 до 3 следующим образом:
0, 0.1, 0.2, 0.3, …, 3
но когда я использую этот код:
double i = 0;
while (i <= 3) {
System.out.printf("%.1f, ", i);
i+= 0.1;
}
или это:
double j = 0;
do {
System.out.printf("%.1f, ", j);
j+= 0.1;
} while (j <= 3);
я получил
0, 0.1, 0.2, 0.3, …, 2.9
Что я делаю неправильно?
Я изменил double на float, и теперь все работает нормально. Спасибо.
@JoeC Отладчик может показать не что иное, как простой System.out.println(i). Это не объясняет, почему в какой-то момент результатом будет 3.0000000000000013, и как можно решить эту проблему.
@ BEN1EK Даже если вам это не нужно для решения этой проблемы, совет Джо сделает вас лучшим программистом, и точка. Каждый хороший программист знает, как правильно отлаживать код, и инструменты, используемые для отладки, являются одними из самых важных в наборе инструментов разработчика.
@corsiKa «Каждый хороший программист знает, как правильно отлаживать код» - и каждый программист отличный знает нет 8-D. Серьезно, вопрос может нуждаться в подсказке к другому (начинающему уровню) Q/A о неточностях с плавающей запятой...
Конечно, я прочитал статью Джо, и она очень полезна.
@ Marco13, конечно, я могу с этим согласиться. Бен смог это исправить, заменив double на float, но готов поспорить, что он не понимает почему. (Подсказка: Бен: числа с плавающей запятой и двойные числа не могут точно хранить числа, такие как 0.1. Однако они могут очень хорошо выполнять .5, .25, .125, .0625... и т. д. Надеюсь, это укажет вам на правильные причины, почему это происходит.
@corsiKa Спасибо. Я изменил свой код на: int i = 0; while (i <= 30) { System.out.printf("%.1f, ", i * 0.1); i++; }




Это из-за точности double. Другим решением может быть использование достаточно точного типа данных, например BigDecimal.
BigDecimal i = BigDecimal.ZERO;
while (i.compareTo(BigDecimal.valueOf(3)) <= 0) {
System.out.printf("%.1f, ", i.doubleValue());
i = i.add(BigDecimal.valueOf(0.1));
}
Похоже, вам может понадобиться научиться использовать отладчик. Пожалуйста, помогите себе немного дополнительные методы отладки. Если после этого у вас все еще возникнут проблемы, пожалуйста, редактировать свой вопрос, чтобы уточнить, какая помощь вам нужна.