質問: excelで 0.1 はなぜ 0.1 となる(表示される) のか 妙なタイトルですが excelで セルに 0.1 と入力したら 0.1 となります(表示されます)。 当たり前の事のようですが これが コンピュータの知識が中途半端にある者からすると実に不思議なのです。 普通の浮動小数点数の理屈からいうと 0.1と言う数値は決して0.1にならない。 0.099999.... となる筈なのですが。 で、お訊きしたいのは ・excelでの表示はなにか特別の丸めが行われるのか? ....セルの書式設定を行わないデフォルト状態で ・excelの実数表現は何か特別(画期的)な方式をとっているのか? ( 例えば0.1を正確に0.1と表現できるような....) という事です。 ちなみに 入力した時だけの話かも?と思いbookをいったん閉じて開いてみても 0.1と表示されました。 また この事はvbaでも同じ様で dim vl as single vl=0.1 msgbox vl としても 0.1 と表示されます。 ググってみると 浮動小数点数の誤差についての解説は腐るほどあるのですが この様に誤差がでない(?)理由に言及したサイトは 見つけられなかったので質問しました。 宜しくお願いします。
回答: 有効な桁までしか表示していない書式設定を使っているからです。 「誤差が出ない」のではありません。 「誤差部分を端数処理して、信用できる桁だけを表示する」という処理を行っています。 excelの内部では「倍精度浮動小数点数」という形で処理されています。 https://ja.wikipedia.org/wiki/%e5%80%8d%e7%b2%be%e5%ba%a6%e6%b5%ae%e5%8b%95%e5%b0%8f%e6%95%b0%e7%82%b9%e6%95%b0 細かい話はともかく、これを使って 値 = 2進数で53桁の小数 × 2のn乗 という形で値を表わしています。 もし、54桁以上になってしまう場合は、「四捨五入に相当するような2進数の処理」をすることで、 53桁に納めます。 これによる小数54位以降の分が誤差になります。 0.1(10進数)は2進数にすると 0.000 1100 1100 1100 ... と循環小数になり,無限桁になります。 そのため、先頭の1から53桁目までに丸められます。 これが「0.1(10進数)は正確な0.1(10進数)ではない」という原理です。 この「2進53桁に丸められた浮動小数点数」を10進数に変換すると 0.10000 00000 00000 00555 11151231257827021181583404541015625 になります。これは「2進53桁に丸められた浮動小数点数」と完全に一致します。 ですから、元の「浮動小数点数」に含まれていた誤差も、そのまま誤差として残っています。 そこで、誤差を含む信用できない桁は端数処理して、信用できる桁だけを使おう、と考えます。 2進数で53桁まではあるので、それに該当する10進数の桁までは、信用していいでしょう。 2進数で53桁は、10進数では16桁程度に該当します。(log_10(2^53)) そこで、 0.################ という書式設定を適用すると 0.10000 00000 00000 0 0555 11151231257827021181583404541015625 は16桁目で端数処理されて 0.10000 00000 00000 0 となり、 # で小数点以下の0は表示しないので 0.1 になります。 「g/標準」では、上記のような桁調整を、値に合せて調整したものを使っています。 他に、桁が大きくなった場合は e表現を使うとか。 逆に 0.000000000000000000000000000000000 みたいな書式にしたら、誤差の分まで表示されるかもしれません (今手許にexcelが無いので確認ができませんが) msgbox v1 の方も同じです。 ここでは v1(single)が暗黙に stringに変換されています。このときに「g/標準」のような書式を使って文字列化しています。