質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

7回答

1173閲覧

なぜ11になるのか

aaaaaaaa

総合スコア501

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

2グッド

0クリップ

投稿2015/12/09 11:08

プログラムに関する指南サイトを閲覧中に発見した広告に書いてあるソースについて疑問があったので質問しました。

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になるのでしょうか。

ikuwow, maisumakun👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

既に皆様がご回答くださっているように・・・

それは、JavaScriptだけでなくプログラミング言語の多くで、小数の内部表現が有限長の2進数によるために「誤差(=桁落ち)」が発生するので、0.1 を 10 回足しても 1.0 にならず、ループが 11 回、回ってしまうからです。

詳しくは、下記ページなどをご参照ください。
小数(浮動小数点数型)の計算が思った結果にならない理由と解決法

投稿2015/12/09 11:23

編集2015/12/09 11:25
pi-chan

総合スコア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

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

浮動小数点演算には誤差があります。整数演算にすれば、期待通りに 10 が返ります。

JavaScript

1var i = 0; 2var cut = 0; 3 4while(i<10) { 5 cut++; 6 i += 1; 7} 8 9console.log(i, cut); // 10 10

Re: aaaaaaaa さん

投稿2015/12/09 11:20

think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

浮動小数点の演算では誤差が生じる前提で行わなければなりません。はい。

自分が使っている浮動小数点の精度に対して、有効数字が何ケタになるのか常に意識する癖をつけた方が良いでしょう。たいていは、その機種の言語仕様書に明記されています。

投稿2015/12/09 12:11

T.Kanno

総合スコア915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

浮動小数点数の話ですね

投稿2015/12/09 11:24

編集2015/12/09 11:25
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「数値を2進数、つまり2の階乗の和で表現しようとするため」らしいですよ

http://ginpen.com/2011/12/13/decimal/

投稿2015/12/09 11:16

recal

総合スコア1126

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問