Double.toString 总是产生与双文字完全相同的结果吗?

ss.*_*ss. -2 java floating-point

Double.toString(0.1)产生“0.1”,但 0.1 是浮点数。

浮点数无法在程序语言中精确表示,但 Double.toString 会产生精确的结果(0.1),它是如何做到的,它总是产生数学上等于双精度文字的结果吗?

假设文字是双精度的。

这是我看到的问题:

当使用Apache POI读取excel文件时,XSSFCell.getNumericCellValue只能返回double,如果我使用BigDecimal.valueOf将其转换为BigDecimal,总是安全的,为什么?

Eri*_*hil 5

\n

Double.toString 产生精确的结果 (0.1),它是如何做到的,它是否总是产生数学上等于双精度文字的结果结果吗?

\n
\n

Double.toString(X)X如果X是具有 15 个或更少有效数字的十进制数字并且它在格式的范围内,则始终会生成等于的数字Double

\n

有两个原因:

\n
    \n
  1. Double格式(IEEE-754 二进制 64)具有足够的精度,因此始终可以区分 15 位十进制数字。
  2. \n
  3. Double.toString通常不显示准确的Double值,而是生成将数字与附近Double值区分开来所需的最少有效数字。
  4. \n
\n

例如,0.1源文本中的文字将转换为Double值 0.1000000000000000055511151231257827021181583404541015625。但Double.toString默认情况下不会产生所有这些数字。它使用的算法生成 \xe2\x80\x9c0.1\xe2\x80\x9d 因为这足以唯一区分 0.1000000000000000055511151231257827021181583404541015625 与其两个邻居(0.0999999999999999) 9167332731531132594682276248931884765625和0.10000000000000001942890293094023945741355419158935546875。这两个值都离 0.1 更远。

\n

因此,Double.toString(1.234)Double.toString(123.4e-2)Double.toString(.0001234e4)都会产生 \xe2\x80\x9c1.234\xe2\x80\x9d\xe2\x80\x94a 数字,其值等于所有原始十进制数字(在转换为 之前Double),尽管它的不同之处在于由其中一些形成。

\n
\n

当使用Apache POI读取excel文件时,XSSFCell.getNumericCellValue只能返回double,如果我使用BigDecimal.valueOf将其转换为BigDecimal,总是安全的,为什么?

\n
\n

如果正在检索的单元格值不能表示为Double,则XSSFCell.getNumericCellValue必须更改它。根据记忆,我认为BigDecimal.valueOf会产生返回的确切值Double,但我不能对此进行权威评价。这是一个与如何DoubleDouble.toString,因此您可以将其作为一个单独的问题来问。

\n