Javascript Math Error:Inexact Floats

abe*_*bel 6 javascript math

可能的重复:
JavaScript的数学是否被破坏?
浮点是如何存储的?什么时候重要?

码:

var tax= 14900*(0.108);
alert(tax);
Run Code Online (Sandbox Code Playgroud)

以上给出了1609.2的答案

var tax1= 14900*(10.8/100);
alert(tax1);
Run Code Online (Sandbox Code Playgroud)

以上给出了1609.200000000003的答案

为什么?我想我可以收集价值观,但为什么会这样呢?

更新: 找到问题的临时解决方案.

首先乘以:

(14900*10.8)/100 = 1609.2
Run Code Online (Sandbox Code Playgroud)

然而

(14898*10.8)/100 = 1608.9840000000002
Run Code Online (Sandbox Code Playgroud)

为此,将10.8乘以a factor(100 in this case)并调整分母:

(14898*(10.8*100))/10000 = 1608.984
Run Code Online (Sandbox Code Playgroud)

我想如果可以为额外的000s做一个preg_match然后相应地调整因子,可以避免浮点错误.然而,最终的解决方案是数学库.

pol*_*nts 18

浮点值不精确.

这几乎就是问题的答案.精度有限,这意味着某些数字无法准确表示.

有些语言支持语言级别的任意精度数字类型/有理数/复数,但不支持Javascript.既不是C也不是Java.

IEEE 754标准浮点值不能0.1精确地表示.这就是为什么必须非常小心地进行带有美分等的数值计算.有时,解决方案是将值以美分存储为整数,而不是以美元存储为浮点值.


"浮动"点概念,模拟基础10

要了解为什么浮点值不精确,请考虑以下类比:

  • 你只有足够的内存来记住5位数
  • 您希望能够在尽可能宽的范围内表示值

在代表整数,你可以在该范围内代表的数值-99999+99999.超出这些范围的值将要求您记住超过5位数,这是(为了这个例子)你不能做到的.

现在你可以考虑使用定点表示法abc.de.现在,您可以在范围代表值-999.99,以+999.99高达2个位数的精度,例如3.14,-456.78等等.

现在考虑一个浮点​​版本.在你足智多谋中,你想出了以下方案:

n = abc x 10de

现在,你还记得只有5位数a,b,c,d,e,但你现在可以代表更广泛范围内的数字,甚至非整数.例如:

123 x 100= 123.0

123 x 103= 123,000.0

123 x 106= 123,000,000.0

123 x 10-3= 0.123

123 x 10-6= 0.000123

这就是名称"浮点"的产生方式:上面例子中的小数点"浮动".

现在您可以表示各种数字,但请注意,您无法代表0.1234.你也不能代表123,001.0.事实上,有很多你无法代表的价值观.

这就是为什么浮点值不精确的原因.它们可以表示各种各样的值,但由于您只能使用固定数量的内存,因此必须牺牲精确度.


更多技术细节

abc被称为有效数,也就是系数/尾数.的de指数,又名规模/特性.像往常一样,计算机使用基数2代替10.除了记住"数字"(位,真的),它还必须记住有效数和指数的符号.

单精度浮点类型通常使用32位.双精度通常使用64位.

也可以看看