アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセルで、=rounddown(25.4-25.3,1)をしたら結果が「0」になります。原因を調べたところ、=25.4-25.3の結果が0.099999・・となっていることが解りました。他の計算式でも、答えは明らかに0.1なのに演算結果は0.09999・・になるパターンがあるようです。
これを解消する方法を教えてください。

A 回答 (3件)

=rounddown(25.4,1)-rounddown(25.3,1)


で如何でしょう。

ただ、実際のところ、これでも完全ではありません。

何故か?

>演算結果は0.09999・・
のように、表示形式で小数点以下の桁数を、「15」桁以上にすると
0.099999999999998
となります。

これは、「浮動小数点」が影響しています。
詳しくは、「浮動小数点とは」で検索してください。
    • good
    • 0

=ROUNDDOWN((254-253)/10,1)



小数点演算を回避するしかないですね。

>celsius = 5 * (fahr - 32) / 9;
>ここで、単に 5/9 を掛ける代わりに、5 をかけてから 9 で割っている理由は、・・・
「プログラミング言語C」13頁)

内容は異なりますが、手法の意味するところは同じかと思います。
    • good
    • 0

=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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!