如果我分配一个变量 double 等于一个数字。我的理解是,这个数字实际使用 1 和 0 表示/存储的内容可能与我刚刚分配的这个数字并不完全相同。那么有没有可能我给一个double变量赋值一个字面值,然后我把这个变量打印出来,打印出来的数字和自由值不同???
我试过 System.out.println(123456789.123456789); 结果是 1.2345678912345679E8。没有不同。
所以,这里有一些关于浮点运算在 Java 中如何工作的规则:
double
with Double.parseDouble(String)
。Double.parseDouble(Double.toString(x))
等于x
,但奇怪的是 NaN 除外。Double.toString(Double.parseDouble(string))
可能不同于string
,因为double
精度有限。例如,Double.toString(Double.parseDouble("3.141592653589793238462"))
将返回3.141592653589793
. (作为推论,System.out.println(3.141592653589793238462)
将打印出来3.141592653589793
。)double
数字都不是这些数字。由于 adouble
存储为二进制分数,例如 1/2 + 1/8 + 1/16 + ...,因此 adouble
不能完全存储十进制数0.1
,因为0.1
不能完全表示为 2 的幂的总和。得到存储在a中的准确值double
,就可以了new BigDecimal(double).toString()
。例如,new BigDecimal(0.1).toString()
returns ,这是在 a 中可表示"0.1000000000000000055511151231257827021181583404541015625"
的最佳近似值。0.1
double
Double.toString(x)
数字是数字最少的十进制数字 Y,它x
是最接近 Y 的数字,可以表示为 a double
。这就是为什么即使0.1
表示为0.1000000000000000055511151231257827021181583404541015625
,也Double.toString
只返回"0.1"
。0.1
或精确十进制值,则基本上必须将 a 转换String
为 a BigDecimal
,如new BigDecimal("0.1")
. 只要您有一个数字作为double
,就不能再信任它来存储准确的十进制值。