Java double to long 转换报错之谜

标签 java

有人可以给我解释一下吗

    public static void main(String[] args) {

    long a = 0;
    long b = 0;
    Random r = ThreadLocalRandom.current();

    for (int i = 0; i < 1000; i++) {
        double d = r.nextDouble()*(r.nextBoolean() ? 1.0 : -1.0);

        a += d*100;
        b += (long)(100*d);
        //System.out.println(a + " " + b + " " + d);

    }

    System.out.println(a);
    System.out.println(b);
    }

为什么 a != b 在这个循环的末尾。这是矩阵中的故障吗?如果我删除“d”的随机签名,那么 a == b。为什么?

最佳答案

这里发生的是四舍五入。

你的任务:

a += d*100
b += (long)(100*d);

将被执行为:

a = (long)(a + d * 100);
b = b + (long)(100 * d);

在一个循环之后,当 a 和 b 为正而 d 为负时,a 和 b 可以不同,反之亦然。将 d*100 添加到 a 时,您添加的是精确值(例如 -1.1),而对于 b,它将首先四舍五入为 -1。 让我们举个例子。在循环开始时,我们将获得这些值:

a = b = 1024
d = -0.178

单次运行的最终结果将是:

a = (long)(1024-17.8) = (long)(1006.2) = 1006
b = 1024-(long)17.8 = 1024-17 = 1007

关于Java double to long 转换报错之谜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58779160/

相关文章:

java - 如何在 Java 的 If/Else 语句中为变量赋值后返回该变量?

Java 链表数组

java - 如何使用 Java 从 MySQL 数据库检索正确的时间戳?

java - 如何使用 JMS 将消息发送到 Websphere MQ,并对 MQ MGR 进行特定回复

java - $JAVA_HOME 与 git bash 上的 java -version 不匹配(最后更新)

java - 将命令行 unicode 参数传递给 Java 代码

java - 是否可以在同一个循环中从 Hashmap 中找到值的第一个实例?

java - 如何返回字符串形式的 actionPerformed?

java - Java GC运行导致OS上的内存使用增加

java - Java 中的过程/工作流