gpt4 book ai didi

java - JavaScript 中的计算结果与 Java 中的不同

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:55:15 26 4
gpt4 key购买 nike

我认为我对大数字有疑问。

Java中的计算:

int n = 4451 + 554 * 57;
n = n << 13 ^ n;
System.out.println(n * (n * n * 15731 + 789221) + 1376312589);
=> 587046333

在 JavaScript 中:

var n = 4451 + 554 * 57;
n = n << 13 ^ n;
console.log(n * (n * n * 15731 + 789221) + 1376312589);
=> 4.043454188561781e+29

JavaScript 版本中的问题是什么?我该如何解决才能使 JavaScript 的结果与 Java 的结果相同?

编辑:试过:https://github.com/jtobey/javascript-bignum , 但结果为 0

var test = new BigInteger(295120061).multiply( new BigInteger(295120061) 
.multiply(new BigInteger(295120061))
.multiply(new BigInteger(15731))
.add(new BigInteger(789221)))
.add(new BigInteger(1376312589));

=> 测试 = 0

最佳答案

JavaScript 没有整数算法,所有数字都存储为 64 位 float (Java 中的 double)。当 JavaScript 看到像 << 这样的位处理运算符时或 ^ ,它暂时将操作数转换为 32 位整数以执行算术运算,但随后将它们转换回 64 位 float 。因此,最后的乘法在 JavaScript 中作为浮点运算执行。在Java中,它仍然是一个整数运算。这段代码在Java中执行相同的操作(我现在已经测试过了,结果是一样的):

int n = 4451 + 554 * 57;
n = n << 13 ^ n;
double x = n;
System.out.println(x * (x * x * 15731 + 789221) + 1376312589);

如果您希望 JavaScript 代码的工作方式与 Java 相同,则需要一种方法来执行乘法和加法,其工作方式与 Java 在溢出时的工作方式相同。也就是说,它必须将所有操作的结果视为在 -231 和 231-1 范围内。在 JavaScript 中使用其原生算法确实没有可靠的方法来做到这一点;即使你给它两个只有 31 位有效位的值,当你将它们相乘时你将得到 62 位有效位,而 JavaScript 的“数字”类型只有 52 位,这意味着一些位会丢失。可能有一个 JavaScript 库可以让你进行这种精确的整数运算,但我不是 JavaScript 框架方面的专家,所以我不知道那会是什么。也许其他人会插话。

关于java - JavaScript 中的计算结果与 Java 中的不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27080357/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com