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)