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
,总是安全的,为什么?
\n\nDouble.toString 产生精确的结果 (0.1),它是如何做到的,它是否总是产生数学上等于双精度文字的结果结果吗?
\n
Double.toString(X)
X
如果X
是具有 15 个或更少有效数字的十进制数字并且它在格式的范围内,则始终会生成等于的数字Double
。
有两个原因:
\nDouble
格式(IEEE-754 二进制 64)具有足够的精度,因此始终可以区分 15 位十进制数字。Double.toString
通常不显示准确的Double
值,而是生成将数字与附近Double
值区分开来所需的最少有效数字。例如,0.1
源文本中的文字将转换为Double
值 0.1000000000000000055511151231257827021181583404541015625。但Double.toString
默认情况下不会产生所有这些数字。它使用的算法生成 \xe2\x80\x9c0.1\xe2\x80\x9d 因为这足以唯一区分 0.1000000000000000055511151231257827021181583404541015625 与其两个邻居(0.0999999999999999) 9167332731531132594682276248931884765625和0.10000000000000001942890293094023945741355419158935546875。这两个值都离 0.1 更远。
因此,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文件时,
\nXSSFCell.getNumericCellValue
只能返回double
,如果我使用BigDecimal.valueOf
将其转换为BigDecimal
,总是安全的,为什么?
如果正在检索的单元格值不能表示为Double
,则XSSFCell.getNumericCellValue
必须更改它。根据记忆,我认为BigDecimal.valueOf
会产生返回的确切值Double
,但我不能对此进行权威评价。这是一个与如何Double
和Double.toString
,因此您可以将其作为一个单独的问题来问。