Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 你回答错了吗?_Javascript - Fatal编程技术网

Javascript 你回答错了吗?

Javascript 你回答错了吗?,javascript,Javascript,警报(5.30/0.1) 这将给出52.9999999999999,但应为53。谁能告诉我怎么做,为什么 我想发现一个数可以被一个给定的数整除。请注意,其中一个数字可能是浮点数。要确定一个数字x是否可被一个数字y整除,必须执行x%y(模)。如果结果为0,则它是完全可除的,其他任何结果都不是。您可以通过以下方式获得它: var num=(5.30/0.1); 警报(固定数量(2)) 这将为您提供53.00。原因与 0.1 * 0.2 //0.020000000000000004 一些十进制数字在

警报(5.30/0.1)

这将给出
52.9999999999999
,但应为
53
。谁能告诉我怎么做,为什么


我想发现一个数可以被一个给定的数整除。请注意,其中一个数字可能是浮点数。

要确定一个数字
x
是否可被一个数字
y
整除,必须执行
x%y
(模)。如果结果为0,则它是完全可除的,其他任何结果都不是。您可以通过以下方式获得它: var num=(5.30/0.1); 警报(固定数量(2))


这将为您提供53.00。

原因与

0.1 * 0.2 //0.020000000000000004

一些十进制数字在IEEE754中无法表示,这是JavaScript使用的数学表示法。如果您想对问题中的这些数字进行算术运算,最好先将它们相乘,直到它们成为整数,然后再将它们除以。

将数字缩放为整数。然后计算结果

alert((5.30*10) % (0.1*10));

既然您已经阅读了我评论的文章,您应该知道问题的根源。 您可以通过缩放浮动来部分解决此问题

然后只需编写一个函数:

  • 如果是浮动的话
    • 衡量数字
  • 返回数字可除性的布尔表示形式

这里有一个

然而

由于整数以64位精度存储,因此最大精度约为(2^53), 当缩放较大的数字时,您很快就会超过最大精度

因此,为javascript获取某种BigInteger库可能是一个好主意
如果你想测试浮点数的可整除性,不幸的是,在这种情况下,这也会返回一个与
0
不同的值。问题是“我想发现一个数字可以被给定的数字整除”,大概这意味着“完全可以整除”。如果放弃小数点后的所有内容,则所有否定的结果都将显示为假阳性。@昆廷请参见第一行:这将给出52.9999999999,但应为53。有人能告诉我怎么做和为什么吗?-看第二行。“我想发现一个数字可以被一个给定的数字整除。”。你的答案只针对第一行,没有考虑上下文。上下文很重要。这并不总是有效的,下面的案例:(1.5876*10000)%(0.0001*10000)的结果为0。999999999998@Trans但是
(1.5876*100000)%(0.0001*100000)
确实如此
function isDivisable(n, d) {
    var ndI = 1 + "".indexOf.call(n, "."); //Index of the Number's Dot
    var ddI = 1 + "".indexOf.call(d, "."); // Index of the Divisors Dot
    if (ndI || ddI) { // IF its a float
        var l = Math.max(("" + n).length - ndI, ("" + d).length - ddI); //Longest Decimal Part
        var tmpN = (n * Math.pow(10, l)); //scale the float
        var tmpD = (d * Math.pow(10, l));
        return !~((tmpN % tmpD) - 1); //Substract one of the modulo result, apply a bitwise NOT and cast a boolean.
    }
    return !~((n % d) - 1); // If it isnt a decimal, return the result 
}
console.log(isDivisable(5.30, 0.1));//true