此输出应为true。但它始终为false。
Number.isInteger(parseFloat('134965.83') / parseFloat('0.01'))
答案 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.EPSILON(see 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时