アラート (5.30/0.1);
これは与えます52.99999999999999
が、そうあるべきです53
。誰がどのように、そしてその理由を教えてもらえますか?
与えられた数で割り切れる数を見つけたいです。数値の 1 つが float の場合があることに注意してください。
アラート (5.30/0.1);
これは与えます52.99999999999999
が、そうあるべきです53
。誰がどのように、そしてその理由を教えてもらえますか?
与えられた数で割り切れる数を見つけたいです。数値の 1 つが float の場合があることに注意してください。
同じ理由で
0.1 * 0.2 //0.020000000000000004
一部の 10 進数は、JavaScript で使用される数学的表現である IEEE 754 では表現できません。質問でこれらの数値を使用して算術を実行する場合は、最初に整数になるまで乗算してから除算することをお勧めします。
数値が全体になるようにスケーリングします。次に、結果をモジュラスします。
alert((5.30*10) % (0.1*10));
私がコメントした記事を読んだので、問題の根本を知っているはずです。フロートをスケーリングすることで、部分的に回避できます...
次に、次の関数を記述します。
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 を取得することをお勧めします。
次のようにして取得できます。varnum=(5.30 / 0.1); alert(num.toFixed(2));
これで53.00になります。
数があなたがしなければならない数x
で割り切れるかどうかを調べるには(モジュロ)。結果が 0 の場合は完全に割り切れますが、それ以外は割り切れません。y
x % y