Double.toString produces the exact result (0.1), how does it do that, is it always produces the result that mathematically equal to the double literal?
Double.toString(XXX)
will always produce a numeral equal to XXX
if XXX
is a decimal numeral with 15 or fewer significant digits and it is within the range of the Double
format.
There are two reasons for this:
- The
Double
format (IEEE-754 binary64) has enough precision so that 15-digit decimal numerals can always be distinguished.
Double.toString
does not display the exact Double
value but instead produces the fewest significant digits needed to distinguish the number from nearby Double
values.
For example, the literal 0.1
in source text is converted to the Double
value 0.1000000000000000055511151231257827021181583404541015625. But Double.toString
will not produce all those digits by default. The algorithm it uses produces “0.1” because that is enough to uniquely distinguish 0.1000000000000000055511151231257827021181583404541015625 from its two neighbors, which are 0.09999999999999999167332731531132594682276248931884765625 and 0.10000000000000001942890293094023945741355419158935546875. Both of those are farther from 0.1.
Thus, Double.toString(1.234)
, Double.toString(123.4e-2)
, and Double.toString(.0001234e4)
will all produce “1.234”—a numeral whose value equals all of the original decimal numerals (before they are converted to Double
), although it differs in form from some of them.
When use Apache POI to read excel file, XSSFCell.getNumericCellValue
can only return double
, if I use BigDecimal.valueOf
to convert it to BigDecimal
, is that always safe, and why?
If the cell value being retrieved is not representable as a Double
, then XSSFCell.getNumericCellValue
must change it. From memory, I think BigDecimal.valueOf
will produce the exact value of the Double
returned, but I cannot speak authoritatively to this. That is a separate question from how Double
and Double.toString
behave, so you might ask it as a separate question.