Javascript 检查一个十进制数是否是另一个十进制数的倍数
Javascript Check if one decimal number is a multiple of another decimal number
你好,我正在尝试在 javascript 中构建一个函数来检查一个十进制数是否是另一个十进制数的倍数:
var num1 = 0.0002;
var num2 = 0.0001;
var remainder = (num1 % num2);
console.log(remainder);
if (remainder === 0) {
console.log('️ num1 multiple of num2'); //IF remainder is zero, so num1 is multiple of num2
} else {
console.log('⛔️ num1 NOT multiple of num2');
}
但是当 num1 为 0.0003 时,0.0004、0.0005、0.0006、0.0007 等不工作。
在这种情况下,结果是 0.00009999999999999996
num1 = 0.0008
正在工作
为什么会发生这种情况以及如何解决?
您不能使用浮点数来精确表示大多数数字,它们总是会有一点点偏差,因此与其比较是否相等,不如将差异与某个 epsilon 进行比较。
function is_multiple(num, den) {
return Math.abs(Math.round(num/den)-num/den) < 1e-15
}
console.log(is_multiple(0.0003, 0.0001))
我不是数学高手所以对此持保留态度。这似乎对我有用。我尝试了您 post 中的所有示例值,它们都以倍数传递。可能适用于所有值,也可能不适用于所有值。
const numA = 0.0005;
const numB = 0.0001;
if (Number.isInteger(Math.fround(numA / numB))) {
console.log('is multiple');
} else {
console.log('not a multiple');
}
Javascript浮动有问题,关注this.
解决方案是将两个数字乘以 10000,然后对整数执行 % 运算符。
你可以通过这种方式获取要乘的指数
const exp = num1.toString().split(".")[1].length
然后乘以这样的数字
num1 * (10**exp)
你好,我正在尝试在 javascript 中构建一个函数来检查一个十进制数是否是另一个十进制数的倍数:
var num1 = 0.0002;
var num2 = 0.0001;
var remainder = (num1 % num2);
console.log(remainder);
if (remainder === 0) {
console.log('️ num1 multiple of num2'); //IF remainder is zero, so num1 is multiple of num2
} else {
console.log('⛔️ num1 NOT multiple of num2');
}
但是当 num1 为 0.0003 时,0.0004、0.0005、0.0006、0.0007 等不工作。 在这种情况下,结果是 0.00009999999999999996
num1 = 0.0008
正在工作
为什么会发生这种情况以及如何解决?
您不能使用浮点数来精确表示大多数数字,它们总是会有一点点偏差,因此与其比较是否相等,不如将差异与某个 epsilon 进行比较。
function is_multiple(num, den) {
return Math.abs(Math.round(num/den)-num/den) < 1e-15
}
console.log(is_multiple(0.0003, 0.0001))
我不是数学高手所以对此持保留态度。这似乎对我有用。我尝试了您 post 中的所有示例值,它们都以倍数传递。可能适用于所有值,也可能不适用于所有值。
const numA = 0.0005;
const numB = 0.0001;
if (Number.isInteger(Math.fround(numA / numB))) {
console.log('is multiple');
} else {
console.log('not a multiple');
}
Javascript浮动有问题,关注this.
解决方案是将两个数字乘以 10000,然后对整数执行 % 运算符。
你可以通过这种方式获取要乘的指数
const exp = num1.toString().split(".")[1].length
然后乘以这样的数字
num1 * (10**exp)