繁体   English   中英

java存储如何浮动v double

[英]How java stores float v double

我意识到一个十进制数只能在二进制系统中如此精确地存储为浮点数,但我不明白的是在我的输出10/7的小数点后7位发生了什么。

在我的第一次输出测试中,我注意到浮动结束时的5(第7位)和4(第7位),然后是双精度中的2。 我认为浮动中的第7位将是4,因为双排位的第8位是2。

Float 1.4285715 Double 1.4285714285714286

然后我使用float格式将下一个输出测试运行到17个位置。 每个中的第8个位置是不同的 - 浮点数是6,这就是为什么第7个位置舍入为5我假设。

Float 1.428571462631225600 Double 1.428571428571428600

在第三个输出测试中,我尝试使用字符串格式进行直接转换,以查看会发生什么。 我得到了与第二次测试相同的结果。

如果我对复杂的浮点存储方法有一个简单的问题 - 我很抱歉。

    float f = 10/7f;
    double d = 10/7d;

    System.out.format
        ("Float  %1s\nDouble %2s\n", f,d);
    /*
     *  Float  1.4285715
        Double 1.4285714285714286
     */

    System.out.format
        ("Float  %1$.17f\nDouble %2$.17f\n", f,d);
    /*
     *  Float  1.428571462631225600
        Double 1.428571428571428600
     */

    System.out.format
        ("Float  %1s\nDouble %2s\n", (double)f,d);
    /*
     *  Float  1.4285714626312256
        Double 1.4285714285714286
     */

在我的第一次输出测试中,我注意到浮动结束时的5(第7位)和4(第7位),然后是双精度中的2。 我认为浮动中的第7位将是4,因为双排位的第8位是2。

如果您认为浮点数在内部以十进制存储并四舍五入到某些十进制数字,则此期望才有意义。 但事实并非如此,浮点数在内部以二进制形式存储,并舍入为某些二进制数字。

您的期望是基于对浮点数的存储方式的误解。 您会看到双精度具有更准确的小数位,因为这是因为它们具有更准确的二进制位置。 该实现根本不以十进制形式存储数字。

有关简化说明,请尝试以下网站:

http://floating-point-gui.de/basic/

有关详细说明,请尝试以下操作:

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

看来,当您使用float它会使用此数字的默认精度8位数。 当你指定一个精度时,它表明它实际上使用double来计算值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM