为什么同一个数学表达式的两个形式会得到不同的结果 [javascript]?

4

已知:x^2 - 4y^2 = (x - 2y)*(x + 2y)

enter image description here

我编写了以下代码:

x = 450000005;
y = 225000002;
n = x * x - 4 * y * y;
m = (x - 2 * y) * (x + 2 * y);
console.log(n, m);

输出结果为:

900000032 900000009

那么在 JavaScript 中发生了什么使得这两个表达式有不同的结果呢?(并非所有数字都会出现这种情况!)

无法在黑色SO主题下看到该方程式。 - phuzi
1
我正在使用黑色背景,而那张图片几乎无法辨认... - Laurent S.
1
仅为说明不可读性。 - VLAZ
@phuzi 抱歉,我不知道如何编写公式,所以我使用了一张图片。 - Gudarzi
没问题,但请不要使用带有透明背景的图片。 - phuzi
显示剩余3条评论
2个回答

6

您的第一个计算超过了Number.MAX_SAFE_INTEGER,这意味着它无法被准确地表示。使用BigInt将产生正确的结果。

console.log("Is 450000005 * 450000005 (x * x) safe?",
  Number.isSafeInteger(450000005 * 450000005));
x = 450000005n;
y = 225000002n;
n = x * x - 4n * y * y;
m = (x - 2n * y) * (x + 2n * y);
console.log(n.toString(), m.toString());


3
您使用的数字对于JavaScript的IEEE 754实现来说太高了,无法准确表示较低位数。 Number.MAX_SAFE_INTEGER是:

console.log(Number.MAX_SAFE_INTEGER);

其中包括 x * x 的表达式超出了限制。

请改用 BigInts:

x = 450000005n;
y = 225000002n;
n = x * x - 4n * y * y;
m = (x - 2n * y) * (x + 2n * y);
console.log(String(n), String(m));


嗯,这并不是特别针对JavaScript的实现,尤其是考虑到JavaScript没有单一的实现,而是有多个运行时,它只是一般标准,以及64位浮点数可以容纳多少内容。 - user12492341

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接