Javascript 有没有人遇到过Math.js自动近似问题,并为此找到了解决办法?

Javascript 有没有人遇到过Math.js自动近似问题,并为此找到了解决办法?,javascript,Javascript,有没有人遇到过Math.js自动近似问题,并为此找到了解决办法 如果我输入的任何数字超过18位,则此库返回近似值;不是确切的数值。假设用户输入“030301300300309293689”,则返回“30301300000309293600”,当用户输入“3030130000309293799”时,甚至返回“3030130000309293600”。我们能停止这种近似吗?这是一个bug,或者如果不是,那么如何避免近似 由于此近似值,如果任何用户输入“03030130000309293695==03

有没有人遇到过Math.js自动近似问题,并为此找到了解决办法

如果我输入的任何数字超过18位,则此库返回近似值;不是确切的数值。假设用户输入“030301300300309293689”,则返回“30301300000309293600”,当用户输入“3030130000309293799”时,甚至返回“3030130000309293600”。我们能停止这种近似吗?这是一个bug,或者如果不是,那么如何避免近似

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

github--

我们可以在(演示记事本中)尝试此功能

这是发布生产


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

0303013003000929369503030130030009293799几乎是相同的数字

怎么做?

据此,JS编号的限制为9007199254740992(2^53)。您的两个数字都大于此数字,因此忽略了精度。您可能需要像这样使用库


这不是图书馆的问题,只是语言架构的问题。你甚至可以打开浏览器控制台,输入你的等式,看看它是否真实。

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

我在这里写了一个解释:

有关更多详细信息,请阅读wikipedia页面中的64位双精度:

现在是问题的第二部分:

如果不是,我如何避免近似

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

  • 对于浏览器,有以下内容:

    这是用纯javascript编写的。也应该是可用的node.js

  • 对于node.js,有以下内容:

    它是OpenSSL使用的大数字库的包装器。它是用C编写的,因此无法在浏览器中加载,但在node.js上应该更快,可能更节省内存


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


我认为,如果任何时候用户输入“03030130000309293695==03030130000309293799”这样的两边数字,那么我们就可以进行字符串比较。其余所有情况将按近似值处理。@病毒,是的,将比较近似值,因为无法表示这么大的数字。的可能重复项