按功能更换模数

时间:2014-05-03 02:15:15

标签: javascript

当我尝试8067 % 80.67时,我得到80.66999999999983,而不是0因为已知的浮点JavaScript行为。

所以我去做了一个函数,以避免浮点javascript错误。

function math(a, b) {

    var left = Math.abs(a),
        times = 1,
        abs = a >= 0 ? 1 : -1;

    while (Math.abs(a) >= b * times) {
        left -= b;
        times++;
    }
    return (a - (b * (times - 1))) * abs;
}

http://jsfiddle.net/s5w3C/

所以我的问题是:这是否有用,即使用而不是%的好工具?是否有这种情况会产生像模% oprator那样的虚假结果。 我正在寻找一种工具来持续计算%

2 个答案:

答案 0 :(得分:0)

我没有真正检查算法的正确性,但如果你关心效率,这是一个坏主意。基本上,输入越大,代码执行的速度就越慢。

答案 1 :(得分:0)

我认为任何修复只能达到一定的准确度和特定大小的数字。也许类似以下内容就足够了:

function nearlyMod(a, b) {
  var precision = ('' + b).split('.').length;
  var estimate = (a % b).toFixed(precision);
  return estimate == b ? 0 : +estimate;
}

console.log(nearlyMod(8067, 80.66)); // 1
console.log(nearlyMod(8067, 80.67)); // 0
console.log(nearlyMod(8067, 80.68)); // 79.68

它测试结果是否是原始数字精度内的偶数除数。如果是,则返回0,否则返回相同精度的数字(可能是您想要的也可能不是。)

结果始终是一个数字(从返回到固定的值是一个字符串,因此+estimate)。

更好的名称可能是“舍入模式”或类似名称。