プログラムに関する指南サイトを閲覧中に発見した広告に書いてあるソースについて疑問があったので質問しました。
javascript
1 var i = 0; 2 var cut = 0; 3 4 while(i<1) { 5 6 cut++; 7 i += 0.1; 8 }
上記のcut変数は、私は10になると思ったのですが実行してみると11になりました。
0.1から始まり1になればcutも10になると思ったのですが見当ちがいでした。
いったいなぜ11になるのでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
浮動小数点の演算は、精確に実行できない場合があるためです。
以下のように、ループ内にconsole.log
を仕込んで実行してみると、その様子が分かります。
javascript
1var i = 0; 2var cut = 0; 3 4while(i<1) { 5 6 cut++; 7 i += 0.1; 8 9 console.log("cut=" + cut); 10 console.log("i=" + i); 11}
私の環境だと、以下のような結果になりました。
cut=1 i=0.1 cut=2 i=0.2 cut=3 i=0.30000000000000004 cut=4 i=0.4 cut=5 i=0.5 cut=6 i=0.6 cut=7 i=0.7 cut=8 i=0.7999999999999999 cut=9 i=0.8999999999999999 cut=10 i=0.9999999999999999 cut=11 i=1.0999999999999999
投稿2015/12/09 11:20
総合スコア4791
0
ベストアンサー
既に皆様がご回答くださっているように・・・
それは、JavaScriptだけでなくプログラミング言語の多くで、小数の内部表現が有限長の2進数によるために「誤差(=桁落ち)」が発生するので、0.1 を 10 回足しても 1.0 にならず、ループが 11 回、回ってしまうからです。
詳しくは、下記ページなどをご参照ください。
小数(浮動小数点数型)の計算が思った結果にならない理由と解決法
投稿2015/12/09 11:23
編集2015/12/09 11:25総合スコア5936
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
2進数では0.1は割り切れない数であるため、
足していくと誤差が生じます。
. i+=0.1 1 0.10000000000000000555 2 0.20000000000000001110 3 0.30000000000000004441 4 0.40000000000000002220 5 0.50000000000000000000 6 0.59999999999999997780 7 0.69999999999999995559 8 0.79999999999999993339 9 0.89999999999999991118 10 0.99999999999999988898 11 1.09999999999999986677
投稿2015/12/09 11:21
総合スコア13521
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
浮動小数点数の話ですね
投稿2015/12/09 11:24
編集2015/12/09 11:25退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
「数値を2進数、つまり2の階乗の和で表現しようとするため」らしいですよ
投稿2015/12/09 11:16
総合スコア1126
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。