码:
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精确地表示.这就是为什么必须非常小心地进行带有美分等的数值计算.有时,解决方案是将值以美分存储为整数,而不是以美元存储为浮点值.
要了解为什么浮点值不精确,请考虑以下类比:
在代表整数,你可以在该范围内代表的数值-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位.