使用除法运算符的Javascript除法错误

时间:2016-03-22 06:58:58

标签: javascript jquery angularjs html5 javascript-objects

此输出应为true。但它始终为false。

Number.isInteger(parseFloat('134965.83') / parseFloat('0.01'))

3 个答案:

答案 0 :(得分:2)

Javascript中的浮点运算是broken,也是general

它与除法无关,如果你没有进行除法,它将返回false,因为你正在检查浮点值。

Number.isInteger(parseFloat('134965.83') / parseFloat('0.01'))转换为Number.isInteger(13496582.999999998) - > false

检查这些examples

Number.isInteger(parseFloat('134965.83') )// outputs false without division

根据spec

  

如果Type(参数)不是Number,则返回false。

     

如果floor(abs(参数))≠abs(参数),则返回false。

答案 1 :(得分:1)

这是因为除法的结果不是整数,而是类似13496582.999999998

某些浮点数需要非常小的精度,受所用数据类型的限制。例如,数字1/3永远不能完全表示为0.333333333333,因为数据类型大小有限制。因此,浮动操作中总会出现一个小的舍入误差。

编辑:在回复评论询问有关如何处理此问题的建议时,实际上有several possibilities。这取决于背景和所需的准确性。

简而言之,要克服这一点,请使用非常小的常量Number.EPSILONsee also this)并将其用于比较。 免责声明:这只是一个简单的例子,广泛阅读对所提供链接的影响。

var myIsInteger = function(n) {
  return (n % 1) > Number.EPSILON
};

我们有效地检查1除法的残差是否在常数内。

答案 2 :(得分:0)

parseFloat('134965.83')/ parseFloat('0.01')= 13496582.999999998

当Number.isInteger(13496582.999999998)总是返回false时