Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
小数点切り捨て処理
投稿日時: 17/11/23 07:11:33
投稿者: ngc1955

フォームにテキストボックスを2個用意し小数点一桁の距離数を入力し
足し算して切り捨てて整数で処理をするコードを書きました。
 
距離1が3.9km距離2が4.1kmならば結果は8kmですが
このコードだと7kmになってしまいます。
 
Dim kyoriGoukei As Single
 
Private Sub CommandButton1_Click()
     
    kyoriGoukei = Int(Val(TextBox1.Value) + Val(TextBox2.Value))
     
    MsgBox (kyoriGoukei)
 
End Sub
 
試行錯誤して
 
  kyoriGoukei = Val(TextBox1.Value) + Val(TextBox2.Value)
     
    MsgBox (int(kyoriGoukei))
 
ならば正しく結果が出ることがわかりましたが、今後もやってしまいそうです。最初の間違ったコードはなぜだめなのでしょう。

回答
投稿日時: 17/11/23 10:05:27
投稿者: simple

ひと言で言うと、浮動小数点誤差によるもの、ということでしょうか。
ご存じのように2進数で管理されます。
3.9と10進数では2桁ですが、2進数では多数桁になります。
3.9 + 4.1 が 8に極めて近い、7.xxxxxxxxxx となっているのでしょうね。
 
浮動小数点誤差とは何か、これへの対応策等については下記定番記事を参考にしてください。
http://web.archive.org/web/20160413003500/http://pc.nikkeibp.co.jp/pc21/special/gosa
http://web.archive.org/web/20160815202704/http://pc.nikkeibp.co.jp/pc21/special/gosa/eg1.shtml
http://web.archive.org/web/20160807013422/http://pc.nikkeibp.co.jp/pc21/special/gosa/eg2.shtml
http://web.archive.org/web/20160726032410/http://pc.nikkeibp.co.jp/pc21/special/gosa/eg3.shtml
http://web.archive.org/web/20160808054439/http://pc.nikkeibp.co.jp/pc21/special/gosa/eg4.shtml
 
この場合の対応策は色々あるでしょうけど、
Int(Round(CDbl(s1) + CDbl(s2), 5))
のような形式ではどうですか?

投稿日時: 17/11/24 14:17:36
投稿者: ngc1955

ありがとうございました。最近私が扱う計算で良く出てくるのでご紹介のリンクで浮動小数点の問題を理解して今後も注意したいと思います