如果我给一个变量赋值,double等于一个数字。我的理解是,使用1和0实际表示/存储的数字可能与我刚刚分配的数字不完全相同。那么,有没有可能我给一个双变量赋值,然后我打印出这个变量,打印出的数字与自由值不同???
我试用了System.out.println(123456789.123456789);结果为1.23345678912345679E8。没有区别。
因此,以下是关于浮点运算在Java中如何工作的一些规则:
- 在程序中编写浮点文字时,Java编译器会将该值解析为
double
和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
中的精确数字既不是这两个数字。由于CCD_ 13被存储为二进制分数(如1/2+1/8+1/16+…)。。。,double
不能像0.1
那样准确地存储十进制数,因为0.1
不能准确地表示为2的幂和。要获得存储在double
中的确切值,可以执行new BigDecimal(double).toString()
。例如,new BigDecimal(0.1).toString()
返回"0.1000000000000000055511151231257827021181583404541015625"
,这是可在double
中表示的0.1
的最佳近似 - 由
Double.toString(x)
打印出的数字是具有最少数字的十进制数字Y,使得x
是最接近Y的数字,其可表示为double
。这就是为什么即使0.1
被表示为0.1000000000000000055511151231257827021181583404541015625
,Double.toString
也只返回"0.1"
- 如果要存储精确的值
0.1
或精确的十进制值,基本上必须将String
转换为BigDecimal
,如new BigDecimal("0.1")
中所示。一旦有一个数字作为double
,就不能再相信它会存储精确的十进制值