Double.toString дает точный результат (0,1), как он это делает, всегда ли он дает результат, математически равный двойному литералу ?
Double.toString(XXX)
всегда будет давать число, равное XXX
, если XXX
является десятичным числом с 15 или менее значащими цифрами и находится в диапазоне формата Double
.
Есть для этого есть две причины:
- Формат
Double
(IEEE-754 binary64) имеет достаточную точность, чтобы всегда можно было различить десятичные числа 15-di git. Double.toString
не отображает точное значение Double
, а вместо этого производит наименьшее количество значащих цифр, необходимых для отличия guish числа от ближайших Double
значений.
Например, литерал 0.1
в исходном тексте преобразуется в значение Double
0.1000000000000000055511151231257827021181583404541015625. Но Double.toString
по умолчанию не выдаст все эти цифры. Используемый алгоритм дает «0,1», потому что этого достаточно, чтобы однозначно отличить guish 0,1000000000000000055511151231257827021181583404541015625 от двух его соседей, которые равны 0,099999999999999167332731531132594682276248931884765625 и 0,128000000000000295 Оба они дальше от 0,1.
Таким образом, Double.toString(1.234)
, Double.toString(123.4e-2)
и Double.toString(.0001234e4)
все будут давать «1,234» - число, значение которого равно всем исходным десятичным числам (прежде чем они будут преобразован в Double
), хотя по форме он отличается от некоторых из них.
При использовании Apache POI для чтения файла Excel XSSFCell.getNumericCellValue
может возвращать только double
, если я использую BigDecimal.valueOf
, чтобы преобразовать его в BigDecimal
, всегда ли это безопасно и почему?
Если извлекаемое значение ячейки не может быть представлено как Double
, тогда XSSFCell.getNumericCellValue
должен его изменить. . По памяти я думаю, что BigDecimal.valueOf
даст точное значение возвращенного Double
, но я не могу авторитетно говорить об этом. Это отдельный вопрос от того, как ведут себя Double
и Double.toString
, поэтому вы можете задать его как отдельный вопрос.