2

アラート (5.30/0.1);

これは与えます52.99999999999999が、そうあるべきです53。誰がどのように、そしてその理由を教えてもらえますか?

与えられた数で割り切れる数を見つけたいです。数値の 1 つが float の場合があることに注意してください。

4

5 に答える 5

9

同じ理由で

0.1 * 0.2 //0.020000000000000004

一部の 10 進数は、JavaScript で使用される数学的表現である IEEE 754 では表現できません。質問でこれらの数値を使用して算術を実行する場合は、最初に整数になるまで乗算してから除算することをお勧めします。

于 2013-03-13T11:06:50.487 に答える
7

数値が全体になるようにスケーリングします。次に、結果をモジュラスします。

alert((5.30*10) % (0.1*10));
于 2013-03-13T11:07:04.587 に答える
0

私がコメントした記事を読んだので、問題の根本を知っているはずです。フロートをスケーリングすることで、部分的に回避できます...

次に、次の関数を記述します。

  • フロートの場合
    • 数値をスケーリングする
  • 数値の割り切れるブール値表現を返します

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

JSBinはこちら

でも...

整数は 64 ビットの精度で格納されるため、最大精度は約 (2^53) であり、より大きな数値をスケーリングするとすぐに最大精度を超えます。

したがって、float の割り切れる可能性をテストする場合は、javascript 用の BigInteger Library を取得することをお勧めします。

于 2013-03-13T11:51:46.277 に答える
-1

次のようにして取得できます。varnum=(5.30 / 0.1); alert(num.toFixed(2));

これで53.00になります。

于 2013-03-13T11:04:54.673 に答える
-1

数があなたがしなければならない数xで割り切れるかどうかを調べるには(モジュロ)。結果が 0 の場合は完全に割り切れますが、それ以外は割り切れません。yx % y

于 2013-03-13T11:03:24.430 に答える