と仮定、
var x = .6 - .5;
var y = 10.2 – 10.1;
var z = .2 - .1;
比較結果
x == y; // false
x == .1; // false
y == .1; // false
しかし
z == .1; // true
なぜJavascriptのショーな行動?
と仮定、
var x = .6 - .5;
var y = 10.2 – 10.1;
var z = .2 - .1;
比較結果
x == y; // false
x == .1; // false
y == .1; // false
しかし
z == .1; // true
なぜJavascriptのショーな行動?
浮動小数点は完全に正確ではないためです。あなたはとわずかにの違いで終わることができます。
(サイドノート:私はあなたがそうでなければ、あなたは0.1
と-0.1
を比較しているvar x = .6 - .5;
を意味だと思う)
JavaScriptがIEEE-754倍精度64ビット浮動小数点(ref)を使用しています。これはと非常に良い浮動小数点数の近似ですが、すべての浮動小数点数を2進数で表す完全な方法はありません。
いくつかの不一致は、他の不一致よりも見やすいものです。例えば:
console.log(0.1 + 0.2); // "0.30000000000000004"
C#のdecimal
タイプまたはJavaのBigDecimal
a'la「小数」のことを行うそこにいくつかのJavaScriptライブラリがあります。これは実際には数値が10進数の列として格納される場所です。しかし、それらは万能薬ではなく、さまざまな種類の問題を抱えています(たとえば、1/3
を正確に表現しようとします)。私たちは財務的なものに必要な丸めのスタイルに対処するので、 "小数"型/ライブラリは金融アプリケーションにとって素晴らしいですが、IEEE浮動小数点よりも遅い傾向があります。
レッツ・出力あなたのx
とy
値:
var x = .6 - .5;
console.log(x); // "0.09999999999999998"
var y = 10.2 - 10.1;
console.log(y); // "0.09999999999999964"
ない大きな驚き0.09999999999999998
が0.09999999999999964
から!=
であること。:-)
あなたは比較動作させるために、これらのビットを合理化することができます
function roundTwoPlaces(num) {
return Math.round(num * 100)/100;
}
var x = roundTwoPlaces(0.6 - 0.5);
var y = roundTwoPlaces(10.2 - 10.1);
console.log(x); // "0.1"
console.log(y); // "0.1"
console.log(x === y); // "true"
以上の一般的な解決策:
function round(num, places) {
var mult = Math.pow(10, places);
return Math.round(num * mult)/mult;
}
精度の低下が結果として得られる数値になる可能性があることに注意してください。ただし、同じ数の数字でround
を実行すると、非常に近い非常に近い2つの数値は終了する必要があります(たとえその数字が完全に正確ではないとしても)同じ数字である。
最初の2つの比較は少し奇妙です。なぜあなたはそれらが一致すると思いますか? (-0.1対0.1) – Mat
関連項目:http://stackoverflow.com/questions/1458633/elegant-workaround-for-javascript-floating-point-number-problem – BasTaller