Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript十进制数学_Javascript_Angular - Fatal编程技术网

JavaScript十进制数学

JavaScript十进制数学,javascript,angular,Javascript,Angular,我正在Angular中构建一个应用程序,我试图找到最精确的方法来执行简单的数学方程。作为一个简单的例子,以总和为例 0.1+0.2 我们大多数人都知道,这并不是简单地返回0.3,而是返回0.3 0.300000000004 然而,在我的应用程序中,我要求这些方程的结果非常精确,即我需要0.3作为结果。解决此问题的常用方法是使用toFixed功能: (0.1+0.2).toFixed(2)=0.30 然而,这并不能解决我的问题。假设我需要将1除以11,但在这种情况下,我实际上需要所有的十进制值:

我正在Angular中构建一个应用程序,我试图找到最精确的方法来执行简单的数学方程。作为一个简单的例子,以总和为例

0.1+0.2

我们大多数人都知道,这并不是简单地返回0.3,而是返回0.3

0.300000000004

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

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

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

1/11=0.091

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

有没有一种方法可以在得到精确结果的同时执行这些简单的方程?i、 e.
0.1+0.2=0.3
1/11=0.091

编辑

下面是另一个例子:

15.7+17.4+17.39=50.4899999999


如果你做加法,答案应该是
50.49

,你可以试着把所有的数乘以10再除以它。例如,不要使用
0.1+0.2
,而是使用
(0.1*100+0.2*100)/100
。这等于30,然后可以除以100。
对于除法,你可以试着思考一个人如何进行除法。对于1/11,也就是说一个11适合多少次。没有,所以你要小一点。1.1与1的匹配次数是多少?没有,所以你要小一点。0.11与1的匹配次数是多少?此时,您将使用前面的技巧。11合100,所以我们更大。11*2适合100,所以我们更大。你可以一直坚持下去,直到你意识到11*10不适合100。您可以一直这样做,直到达到您的精度水平。当然,它很粗糙,速度也很慢,但它能工作。您甚至可以进行精细的数学运算,超过16位的不精确级别。

关于为什么会发生这种情况,请看下面的答案:

如果你在做加法,你可以尝试将所有的数乘以10的倍数再除以它。例如,不要使用
0.1+0.2
,而是使用
(0.1*100+0.2*100)/100
。这等于30,然后可以除以100。
对于除法,你可以试着思考一个人如何进行除法。对于1/11,也就是说一个11适合多少次。没有,所以你要小一点。1.1与1的匹配次数是多少?没有,所以你要小一点。0.11与1的匹配次数是多少?此时,您将使用前面的技巧。11合100,所以我们更大。11*2适合100,所以我们更大。你可以一直坚持下去,直到你意识到11*10不适合100。您可以一直这样做,直到达到您的精度水平。当然,它很粗糙,速度也很慢,但它能工作。您甚至可以进行精细的数学运算,超过16位的不精确级别。

关于发生这种情况的原因,请查看以下答案:

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

举个例子:

Number(parseFloat(0.1 + 0.2).toPrecision(16)) = 0.3

Number(parseFloat(1/11).toPrecision(16)) = 0.09090909090909091

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

举个例子:

Number(parseFloat(0.1 + 0.2).toPrecision(16)) = 0.3

Number(parseFloat(1/11).toPrecision(16)) = 0.09090909090909091

JavaScript中的浮点数学是基于二进制浮点标准的,这在许多编程语言中很常见。通常,特别是对于JavaScript(以及生产),最好使用已经设置好的库来处理这些问题。BigNumber就是一个例子——尽管可能有更轻量级的解决方案。JavaScript中的浮点数学基于二进制浮点标准,这在许多编程语言中都很常见。通常,特别是对于JavaScript(以及生产),最好使用已经设置好的库来处理这些问题。BigNumber就是一个例子——虽然可能有更轻量级的解决方案。谢谢你的回答,但是在某些情况下我仍然有一个问题。举个例子:
15.7+17.4+17.39=50.489999999999
而答案应该是
50.49
谢谢你的回答,但是在某些情况下我仍然有问题。举个例子:
15.7+17.4+17.39=50.489999999999
而答案应该是
50.49