【问题标题】:Javascript division error using division operator使用除法运算符的Javascript除法错误
【发布时间】:2016-07-08 23:05:31
【问题描述】:

这个输出应该是真的。但它总是给假。

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

【问题讨论】:

  • 请在 chrome 控制台上测试
  • 13496582.999999998 是浮动的吗?
  • 它不是整数,因为它是浮点数...
  • parseFloat() 总是返回一个浮点数。那么 Number.isInteger() 怎么可能是真的呢?
  • @all 如果你说它总是假的,那么下面的值怎么会变成真的。我的简单怀疑。请在控制台上试一试。 Number.isInteger(parseFloat('134965.82') / parseFloat('0.01'))

标签: javascript jquery angularjs html javascript-objects


【解决方案1】:

Javascript 中的浮点运算是 brokengeneral

与除法无关,不做除法会返回false,因为是检查float值。

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(argument) 不是 Number,则返回 false。

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

【讨论】:

  • 除法后的预期值为13496583..这就是为什么OP期待整数..
  • @RayonDabre 仅当浮点运算以这种方式工作时:) 试试这个parseFloat(1111.1)/parseFloat(0.1)
  • 除法后的预期值为 13496583 ..这就是为什么 OP 期待整数.. 正是你所说的..如果它完全除法,我期待输出为整数。
  • @shamil 在这种情况下你应该给Math.round(Number('134965.83') / Number('0.01'))
  • @gurvinder372 非常感谢。 if(Number.isInteger(parseFloat('134965.80') / parseFloat('0.01'))) 上面的任何替代方案..这是if条件。你给出的建议不适合这里。
【解决方案2】:

发生这种情况是因为除法的结果不是整数,而是类似于13496582.999999998

一些浮点数需要非常小的精度,受所使用的数据类型的限制。例如,数字1/3 永远不能完全表示为0.333333333333,因为数据类型大小有限制。因此,浮点运算中总会存在微小的舍入误差。

编辑:回应评论询问如何处理这个问题,实际上有several possibilities。这取决于上下文和所需的准确性。

简而言之,要克服这个问题,请使用一个非常小的常量 Number.EPSILON (see also this) 并在比较中使用它。 免责声明:这只是一个简单的示例,请广泛阅读所提供链接的含义。

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

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

【讨论】:

  • 是的。请让我知道如何克服这个问题.. 我希望 134965.82/0.01 的行为类似于 134965.83/0.01
  • 提供推荐。
  • 非常感谢 if(Number.isInteger(parseFloat('134965.83') / parseFloat('0.01')){ console.log("true"); } else{ console.log("false" ); //do Nothing } 如何将您的建议与上述建议交替使用。
  • 欢迎。 if (myIsInteger(parseFloat('134965.83') / parseFloat('0.01'))) console.log('bingo');
  • function load(){if (myIsInteger(parseFloat('134965.82') / parseFloat('0.01'))) { console.log("true"); } 其他{ console.log("false"); }} 加载();答案:错误
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    相关资源
    最近更新 更多