划分时的Javascript精度

时间:2014-07-27 09:10:04

标签: javascript floating-point

有没有办法确定将一个数字除以另一个数字是否会导致JavaScript中的整数?与18.4 / 0.002一样,我们9200,但18.4 / 0.1给了我们183.99999999999997。问题是它们都可能是任何浮点数(如0.1,0.01,1,10,......),这使得无法使用标准函数模数或试图减去,浮点精度问题意味着我们有时会获得应该是整数的非整数数字结果,或者不应该是完整数字的结果。

4 个答案:

答案 0 :(得分:3)

一种hacky方式是

  1. 使用toString()
  2. 将这两个数字转换为字符串
  3. 通过剥离.之前的字符(包括.)并获取剩余部分的长度来计算精度点数(N)
  4. 乘以10 ^ N使它们成为整数
  5. 做模数并得到结果
  6. 更新演示: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?