为什么Double在小数点后得到多余的数字?

时间:2018-12-05 00:15:33

标签: java double precision

我正在运行此代码

public class Test{
    public static void main(String args[]){
        double d = Math.log(125)/Math.log(5);
        float f = (float)(Math.log(125f)/Math.log(5f));
        System.out.printf("DOUBLE: %.20f\n", d);
        System.out.printf("FLOAT : %.20f\n", f);
    }
}

并看到以下输出

DOUBLE: 3.00000000000000040000
FLOAT : 3.00000000000000000000

125是5 3 ,因此log(125)/ log(5)理想情况下应为3。如果输出为double,则此输出来自3.00000000000000040000?无法理解原因(内部是什么原因),对此有所帮助。

1 个答案:

答案 0 :(得分:-1)

浮点表示法(浮点数和双精度数)的问题之一是它们不以十进制存储值,而是以二进制形式存储它们。这意味着许多数字近似等于(而不是精确地像整数一样)等于其期望值。当您具有更高的精度时,近似值会更好。

在Java中,double使用八个字节表示,而float使用四个字节。因此,在代表任何特定值时,双精度数通常会比浮点数更好(或至少不会更差)。我希望这就是Java设计人员选择double用作浮点文字表示形式的原因。

  

因此,基本上,当您在Java中说“ float”时,实际上是声明了32位1–8–23 IEEE float,类似地,“ double”是64位1–11–52 IEEE float。