- ベストアンサー
エクセルの演算について
エクセルで、=rounddown(25.4-25.3,1)をしたら結果が「0」になります。原因を調べたところ、=25.4-25.3の結果が0.099999・・となっていることが解りました。他の計算式でも、答えは明らかに0.1なのに演算結果は0.09999・・になるパターンがあるようです。 これを解消する方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
=Rounds(引算(25.4,25.3),1,1) | | | +--- 小数点1桁で丸める +---- 0=四捨五入, 1=切り捨て, 2=切り上げ どうしても、整数演算での回避が気に喰わなければ、 引算() という自作関数を用意するしかないです。 つまり、小数点のまま計算しても誤差が生じない関数を利用する環境を作ることです。 僅か1行の関数ですが小数点演算の不具合が Currency 型の演算で回避することを示しています。 なお、テストでは、Excel の ROUND, ROUNDUP,ROUNDDOWN を統合した Rounds関数も使っています。 この場合、引数は Currency型で受け取っていますよね。 この点では、Excel の各関数も同じだと思います。 これで、なぜ、小数点演算誤差が発生したかを理解できるとおもいます。 Option Explicit Public Const 四捨五入 = 0 Public Const 切り捨て = 1 Public Const 切り上げ = 2 Public Function Rounds(ByVal M As Currency, ByVal A As Integer, Optional D As Integer = 0) As Variant Rounds = Sgn(M) * Fix(Abs(M) * 10 ^ D + Abs((A = 0) * 0.5@ + (A = 2) * (Int(M * 10 ^ D) <> (M * 10 ^ D)))) / 10 ^ D End Function Public Function 引算(ByVal A As Currency, ByVal B As Currency) As Variant 引算 = A - B End Function
その他の回答 (2)
=ROUNDDOWN((254-253)/10,1) 小数点演算を回避するしかないですね。 >celsius = 5 * (fahr - 32) / 9; >ここで、単に 5/9 を掛ける代わりに、5 をかけてから 9 で割っている理由は、・・・ 「プログラミング言語C」13頁) 内容は異なりますが、手法の意味するところは同じかと思います。
- nobu555
- ベストアンサー率45% (158/345)
=rounddown(25.4,1)-rounddown(25.3,1) で如何でしょう。 ただ、実際のところ、これでも完全ではありません。 何故か? >演算結果は0.09999・・ のように、表示形式で小数点以下の桁数を、「15」桁以上にすると 0.099999999999998 となります。 これは、「浮動小数点」が影響しています。 詳しくは、「浮動小数点とは」で検索してください。