[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『「0.5」がセルによって「0」と「1」で異なって表示される』(きゅうり婦人)
おはようございます。
緊急度・重要度は共に高くないのですが、理由を自分では解明できない事案があるため、こちらで相談させていただきます。
タイトルに書いている通りですが、
セルに「0.5」の値が入っているとき、なぜかセルによって「0」と表示されるものと「1」と表示されるものに分かれます。
これはなぜなのでしょうか?
以下、セルの書式設定など
表示形式分類:通貨
小数点以下の桁数:0
記号:なし
負の数の表示形式:-1,234(赤字)
ちなみに、セルの値である「0.5」は、引き算により求められた数値であり、引かれる数・引く数にそれぞれ差はあれど、四捨五入などされていない純粋な「0.5」です。
どなたか、お心当たりのある方がいらっしゃったら、ご教授いただけないでしょうか。
< 使用 Excel:Excel2010、使用 OS:Windows7 >
「0.5」は、小数点以下の表示桁数が0であれば、デフォルトの設定では「1」と表示されるのだと思います。
(関数以外で、四捨五入設定を変えられるのかは知識がないのですが・・・)
「0」と表示されているセルに入力された数式を消し、「0.5」と入力してみたところ、「1」と表示されました。
なにかのご参考までに。
(きゅうり婦人) 2017/07/24(月) 08:45
>ちなみに、セルの値である「0.5」は、引き算により求められた数値であり、 >引かれる数・引く数にそれぞれ差はあれど、四捨五入などされていない純粋な「0.5」です。
計算結果の小数は、純粋な「0.5」でないことがあります。
試しに どこかのセルに
= (0.5 - そのセル) = 0
※具体例 =(0.5-A1)=0
と入れてみてください。どちらか、または両方ともFalseが返るかも知れません。
こういう時は、私のハンドルネームは「ぼけナス」でアップしたいなぁ。
(半平太) 2017/07/24(月) 08:52
ご返信ありがとうございます。
試したところ、falseでした。
小数点以下の表示桁数を20桁くらいにしたところ、0.499999999999999999999999978 みたいな数値が表示されました。
なるほど、純粋な「0.5」ではなかったということなのですね。
失礼いたしました。
ちなみに更問なのですが、
引かれる数と引く数の差が「0.5」である場合に、引き算をして上記のような数値が答えとして返ってくるのはなぜですか?
(きゅうり婦人) 2017/07/24(月) 08:56
>引かれる数と引く数の差が「0.5」である場合に
引き算に限りません。小数を演算すると生ずる誤差です。
原因と考えられるものは2つです。(もっとあるかも)
1.10進数の小数は、2進数の小数として完全に認識できないと言うことです。 ※宿命的に誤差含みになるんです。(演算しないと表面化しないだけ)
例外は、0.5のべき乗を組み合わせて作れる10進数の小数だけです。 通常は、2進数の循環小数になります。
2.コンピュータの演算ビット数には限界があると言うことです。 循環小数は無限ですから、どこかで丸め処理を行うことになり、誤差が生まれる原因になります。
このビット数の限界からは、循環小数に限らず、 整数でも15桁を超えるとやはり正しく数値が認識できないことにつながります。
(半平太) 2017/07/24(月) 09:22
Sub test() Dim i As Long
For i = 1 To 10 Cells(i, "A").Value = Round(i * 0.5, 0) Cells(i, "B").Formula = "=Round(" & i * 0.5 & ", 0)" Next i End Sub
A列が、予想と違う結果になっているのではないかと思います。
これは、端数が0.5の場合、奇数か偶数かで切り上げるか切り下げるかを決めるというルールによるものです。
(???) 2017/07/24(月) 09:39
http://web.archive.org/web/20160522212249/http://pc.nikkeibp.co.jp:80/pc21/special/gosa/eg1.shtml
(まっつわん) 2017/07/24(月) 11:13
まっつわん様にご提示いただいたURLにもアクセスしてみ、とりあえずは理解しました。
小数点以下の計算をするときには注意が必要ということですね。
皆さん、ありがとうございました。
(きゅうり婦人) 2017/07/27(木) 08:39
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.