有没有办法确定将一个数字除以另一个数字是否会导致JavaScript中的整数?与18.4 / 0.002
一样,我们9200
,但18.4 / 0.1
给了我们183.99999999999997
。问题是它们都可能是任何浮点数(如0.1,0.01,1,10,......),这使得无法使用标准函数模数或试图减去,浮点精度问题意味着我们有时会获得应该是整数的非整数数字结果,或者不应该是完整数字的结果。
答案 0 :(得分:3)
一种hacky方式是
toString()
.
之前的字符(包括.
)并获取剩余部分的长度来计算精度点数(N)更新演示:http://jsfiddle.net/9HLxe/1/
function isDivisible(u, d) {
var numD = Math.max(u.toString().replace(/^\d+\./, '').length,
d.toString().replace(/^\d+\./, '').length);
u = Math.round(u * Math.pow(10, numD));
d = Math.round(d * Math.pow(10, numD));
return (u % d) === 0;
}
答案 1 :(得分:1)
我认为你不能用JavaScript的双精度浮点数做到这一点,在整个范围内都不可靠。也许你可以在一些限制范围内(虽然精确错误会出现在各种各样的 - 对我来说 - 意想不到的位置)。
我看到的唯一方法是使用JavaScript的几个“大十进制”库中的任何一个,根本不使用Number
。它们比较慢,但是......
答案 2 :(得分:1)
我假设您在执行分割时希望提醒为零。
检查除数的精度,并将除数和除数乘以10的幂
例如
您要检查2.14/1.245
将{divid}和divis乘以1000
,因为1.245
有3位精度,现在您可以使用2140/1245
这样的整数来执行模数
答案 3 :(得分:0)
将第一个数除以第二个并检查结果是否为整数?
仅当您检查结果是否为整数时,您需要指定舍入阈值。 在javascript中,3.39 / 1.13略大于3。
示例:
/**
* Returns true iif a is an integer multiple of b
*/
function isIntegerMultiple(a, b, precision) {
if (precision === undefined) {
precision = 10;
}
var quotient = a / b;
return Math.abs(quotient - Math.round(quotient)) < Math.pow(10, -precision);
}
console.log(isIntegerMultiple(2, 1)); // true
console.log(isIntegerMultiple(2.4, 1.2)); // true
console.log(isIntegerMultiple(3.39, 1.13)); // true
console.log(isIntegerMultiple(3.39, 1.13, 20)); // false
console.log(isIntegerMultiple(3, 2)); // false
有关浮点舍入问题的详细信息,请查看此内容:Is floating point math broken?