1

如果我分配一个变量 double 等于一个数字。我的理解是,这个数字实际使用 1 和 0 表示/存储的内容可能与我刚刚分配的这个数字并不完全相同。那么有没有可能我给一个double变量赋值一个字面值,然后我把这个变量打印出来,打印出来的数字和自由值不同???

我试过 System.out.println(123456789.123456789); 结果是 1.2345678912345679E8。没有不同。

4

1 回答 1

4

所以,这里有一些关于浮点运算在 Java 中如何工作的规则:

  • 当您在程序中编写浮点文字时,Java 编译器将该值解析为doublewith 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。)
  • 存储在 a中的确切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.1double
  • 打印出来的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,就不能再信任它来存储准确的十进制值。
于 2013-07-16T21:23:09.403 回答