为什么双重存储比长期存储更多的信息? (JAVA)

问题描述 投票:0回答:2

如果长整型和双整型都是8个字节,为什么长整型可以将-9,223,372,036,854,775,808存储到9,223,372,036,854,775,808,而双整型可以存储1.7 * 10 ^ 308?似乎第308位电源需要占用更多存储空间。 (对不起,这是一个简短的问题)

谢谢

java double byte long-integer
2个回答
1
投票

double可以存储与long一样多的不同值,因为它们的位数相同。区别在于位模式的解释方式。长期以来,这非常简单。如果在位模式中加一,则解释值将改变一(上溢/下溢除外)。对于双精度来说,这更加复杂。这些位分为代表基本值和指数值的多个部分。这导致双精度变量的解释值分布不均的行为。例如,如果数字本身很小,则可以表示数字之间的很小的差异,但是如果数字很大,则不能再表示这些小的差异。例如0.0001与0.0002不同,但是1000000000000000000000000.0001与1000000000000000000000000.0002相同。

您可以使用以下代码轻松测试此行为。

double a = 0.0001;
double b = 0.0002;
double c = 1_000_000_000_000_000_000_000.0001;
double d = 1_000_000_000_000_000_000_000.0002;

System.out.println(a == b);
System.out.println(c == d);

将打印

false
true

0
投票

这里有一个小程序,说明了为什么double不能总是正确地完成长时间的工作。函数test打印它的参数,并在long和double的每一个中输出其参数加1的结果:

import java.math.BigDecimal;

public strictfp class Test {
    public static void main(String[] args) {
        test(100);
        test(1L << 60);
    }

    private static void test(long l) {
        double d = l;
        System.out.println("long "+l + " " + (l + 1) + " double " + new BigDecimal(d) + " " + new BigDecimal(d + 1));
    }
}

输出:

long 100 101 double 100 101
long 1152921504606846976 1152921504606846977 double 1152921504606846976 1152921504606846976

使用输入100都是正确的,因为该区域中的所有整数都可以精确地以双精度和长整数表示。

使用输入2 60 long仍会得到确切的答案,但double不会,因为在该区域中某些整数不能精确地用double表示。 2 60可以,2 60 + 1不能。

© www.soinside.com 2019 - 2024. All rights reserved.