首页 > 解决方案 > 为什么Double会在小数点后获得额外的数字?

问题描述

我正在运行这段代码

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。这个输出来自哪里 3.00000000000000040000 在双倍的情况下?无法理解原因(内部是什么原因造成的)对此的任何了解都会有所帮助。

标签: javadoubleprecision

解决方案


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

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

所以基本上当你在 Java 中说“float”时,实际上是声明了一个 32 位 1-8-23 IEEE 浮点数,类似地,“double”是一个 64 位 1-11-52 IEEE 浮点数。


推荐阅读