0

有没有人遇到过 Math.js 自动逼近问题并解决了这个问题?

如果我输入任何超过 18 位的数字,那么这个库会返回近似值;不是确切的值。假设如果用户输入“03030130000309293689”,那么它返回“3030130000309293600”,当用户输入“3030130000309293799”时,即使它返回“3030130000309293600”。我们可以停止这种近似吗?这是一个错误,或者如果不是,那么我该如何避免近似?

由于这种近似,如果任何用户输入“ 03030130000309293695 == 03030130000309293799 ”,那么它将始终返回true,这是完全错误的。

github—— https://github.com/josdejong/mathjs

我们可以在http://mathjs.org/(在演示记事本中)尝试这个。

这是发布生产!

我认为如果任何时候用户输入像“03030130000309293695 == 03030130000309293799”这样的双方号码,我们就可以进行字符串比较。其余所有情况将通过近似处理。为什么我这么说是因为如果我使用相同的库进行“73712347274723714284 *73712347274723713000”计算,那么它会给出科学计数法的结果。

4

3 回答 3

1

0303013000030929369503030130000309293799几乎是相同的数字。

如何?

根据这个答案,JS 编号的限制是 9007199254740992(2^53)。你的两个数字都大于这个数字,所以精度被忽略了。您可能需要使用像Big.js这样的库

这不是库问题,只是语言架构问题。您甚至可以打开浏览器控制台并输入您的方程式以查看它是否真实。

于 2013-10-23T11:29:07.143 回答
0

这实际上不是 Math.js 的问题,而是数字在 javascript 中如何工作的结果。Javascript 使用 64 位二进制浮点数(在 C 中也称为 64 位双精度数)。因此,它只有 53 位来存储您的号码。

我在这里写了一个解释:Javascript number gets another value

您可以阅读 64 位双精度的维基百科页面以获取更多详细信息:http ://en.wikipedia.org/wiki/Double_precision_floating-point_format

现在是你问题的第二部分:

如果不是,那么我该如何避免近似?

javascript中有几个实现大数字的库:

于 2013-10-23T12:47:44.303 回答
0

最新版本的 math.js 支持 bignumbers,请参阅文档:

https://github.com/josdejong/mathjs/blob/master/docs/datatypes/bignumbers.md

于 2013-12-17T21:38:03.040 回答