JavaScript如何检查商是否为整数

3

例子:

1.15 / 0.01 = 114.99999999999999, is an Integer in my case
9.96 / 0.01 = 996.0000000000001, is an Integer in my case
15.121 / 0.01 = 1512.1, Not an Integer

Number.isInteger()在以下情况下不准确:1.15 / 0.019.96 / 0.01


1
你不能这样做。当你使用浮点数时,必须明确决定要使用的特定精度。没有“标准”或“正确”的方法来判断浮点数是否为整数。一切都取决于你决定使用的精度。你必须将数字舍入到你喜欢的精度,然后再次检查。 - Ricky Mo
如果您想超过 number 类型的精度,您可以考虑使用像 decimal.js 这样的库来处理额外的精度。 - Ricky Mo
4个回答

2
我建议使用专门的库来完成这个任务,例如 decimal.js
Decimal对象有一个有用的方法isInteger(),可以在除法完成后调用。
您可以设置所需的精度,但我认为默认值应该足够(20,请参见precision)。

function isQuotientInteger(dividend, divisor) {
    return new Decimal(dividend).dividedBy(new Decimal(divisor)).isInteger();
}

let testInputs = [ { dividend: 1.15, divisor: 0.01 }, { dividend: 9.96, divisor: 0.01 }, { dividend: 15.121, divisor: 0.01 } , { dividend: 3.14159, divisor: 0.00001 }];

formatRow('Dividend', 'Divisor', 'Quotient is integer')
for(let testInput of testInputs) {
    formatRow(testInput.dividend, testInput.divisor, isQuotientInteger(testInput.dividend, testInput.divisor))
}

function formatRow(...row) {
    console.log(...row.map(f => (f + '').padEnd(10)))
}
   
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/decimal.js/10.3.1/decimal.min.js" integrity="sha512-Ou4M+sSU8oa+mE3juYqR3JmW633MUpMhe1cd+IusOtfjkMo8I3zXs4fRmjmCFqpRg5RK/geqoXBY8XRwFY2Rsg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>


0
借鉴这个线程:

在JavaScript中将小数四舍五入到最接近的百分位

let ex1=1.15 / 0.01
let ex2=9.96 / 0.01
let ex3=15.121 / 0.01
const desired_place=3

function round(num, places) {
    //round # to however many places you need
    let multiplier = Math.pow(10, places);
    let rounded= Math.round(num * multiplier) / multiplier;
    return Number.isInteger(rounded)? true : false
}

console.log(round(ex1,desired_place))  //true
console.log(round(ex2,desired_place))  //true
console.log(round(ex3,desired_place))  /false

0
在JavaScript中,所有数字都以浮点数的形式表示,在执行数学运算时可能会出现可见或不可见的舍入问题。不幸的是,Number.isInteger() 在您列出的情况下产生意外结果,我们人类可以清楚地“看到”操作的结果必须是一个整数值。以下是一个实用的解决方案,用于查找给定精度的商是否为整数:
首先,您应该使用Number.toFixed()获取四舍五入到所需精度的数字,然后应用Number.toInteger()

function isInteger(arg) {
  const precision = 12; // for example
  return Number.isInteger(Number(arg.toFixed(precision)));
}

console.log(isInteger(1.15 / 0.01));
console.log(isInteger(9.96 / 0.01));
console.log(isInteger(15.121 / 0.01));


-1

尝试检查余数。

console.log(1.15 % 0.01 === 0) // false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接