当我尝试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;
}
所以我的问题是:这是否有用,即使用而不是%
的好工具?是否有这种情况会产生像模%
oprator那样的虚假结果。
我正在寻找一种工具来持续计算%
。
答案 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
)。
更好的名称可能是“舍入模式”或类似名称。