JavaScript十进制数学



我正在Angular中构建一个应用程序,并试图找到执行简单数学方程的最准确方法。举一个简单的例子,取的总和

0.1 + 0.2

正如我们大多数人所知,这并不是简单地返回0.3,而是返回

0.30000000000000004

然而,在我的应用程序中,我要求这些方程的结果非常准确,即我需要0.3作为结果。解决此问题的常用方法是使用toFixed函数:

(0.1 + 0.2).toFixed(2) = 0.30

然而,这并不能解决我的问题。假设我需要将1除以11,但在这种情况下,我实际上需要所有的十进制值:

1/11 = 0.09090909090909091

虽然toFixed(2)实际上只返回0.09,但对于我的应用程序,我需要更高的精度,即上面的结果。

有没有一种方法可以在得到准确结果的同时执行这些简单的方程?即CCD_ 8和CCD_。

编辑

这里是另一个例子:

15.7 + 17.4 + 17.39 = 50.48999999999999

而答案应该是CCD_ 11

您可以使用toPrecision()方法,该方法返回一个表示数字的字符串,传递一个指定有效位数的参数(如果您想裁剪结果,则为16(,然后将其解析为Number

例如:

Number(parseFloat(0.1 + 0.2).toPrecision(16)) = 0.3
Number(parseFloat(1/11).toPrecision(16)) = 0.09090909090909091

如果你在做加法,你可以试着把所有的东西都乘以10的倍数并除以它。例如,用(0.1 * 100 + 0.2 * 100) / 100代替0.1 + 0.2。这就是30,然后你可以将其除以100。
对于除法,你可以试着思考人类将如何进行除法。对于1/11,也就是说11合一的次数。没有,所以你变小了。1.1和1合多少次?没有,所以你变小了。0.11和1合多少次?在这一点上,您使用前面的技巧。11适合100,所以我们更大。11*2适合100,所以我们更大。你可以一直坚持下去,直到你意识到11*10不适合100。你可以一直这样做,直到达到你的精确水平。当然,它既粗糙又缓慢,但它确实有效。你甚至可以做精细级别的数学运算,超过16位数的不精确级别
要了解发生这种情况的原因,请查看以下答案:https://stackoverflow.com/a/27030789/12243248

最新更新