「みんな教えて! 選手権!!」開催のお知らせ

利息計算をVBAのユーザ定義関数で行ったところ、1円単位で合わないので
調べたところ、INT関数の挙動がおかしいみたいです。(下記のとおり割り切れる
のに、INT関数を使うと1ずれてしまう)
調べてもエクセルのINTとおなじく小数点以下を切り捨てる(整数ではrounddown(,0)と
同じと記載されてます。どうしてこうなるのか、ご教授願いないでしょうか。

Function test()
t = 0.142 / 200 * 10000000
test3 = Int(t)
End Function
 結果:7099

Function test()
t = 0.142 / 200 * 10000000
test3 = t
End Function
 結果:7100

A 回答 (4件)

お金を取り扱うための変数の型があるのになぜ使わないのですか。


なぜ型にルーズなまま小数点の計算をしようとするのですか。

Dim t As Currency
t = 0.142 / 200 * 10000000
MsgBox Int(t)

とか

Dim t As Variant
t = CCur(0.142 / 200 * 10000000)
MsgBox Int(t)

とか
    • good
    • 1

・除算を伴う浮動小数点計算時における二進数と十進数変換時の誤差


・計算順序による誤差
 例えば、1÷3×3の計算をする場合
 1÷3の結果は0.333333...と無限に続き割り切れませんが、数値の
有効桁数には上限が有る為に、それを越えた値は削除されます。
その状態で、続きの×3をすると0.999999...となります。
普通に計算結果の値を表示する時には、有効桁数の範囲外の値も考慮
される為、1が表示されますが、INT関数を使った場合の表示は1には
なりません。
1×3÷3の様に、乗算を先に、除算を後になる様に、計算順序を入れ
替える事で、回避が可能な場合が有ります。
    • good
    • 0

こんにちは!



浮動小数点誤差の影響だと思われます。
小数点以下の数値計算(特に時間計算など)は気を付ける必要があります。
2進数で計算する場合の宿命とも言われています。

0.142/200 の計算結果は0.00071 と表示されても内部では 0.00070999・・という計算結果になっていて
*10000000 とすると 7099.9・・ になり
INT関数を使ってしまうと、小数点以下が切り捨てられますので、7099 といった表示になるのでは?

無理やりって感じですが、小数点以下をある程度の桁数に丸めると解消されることがあります。
t = Int(WorksheetFunction.Round(0.142 / 200 * 10000000, 6))

としたらどうなりますか?m(_ _)m
    • good
    • 0

2進数計算ですので、、、


0.142が正確に表現できていない(無限小数)のではないでしょうか?
    • good
    • 0
この回答へのお礼

X-1919 さん こんにちは

 型は例では省いてますが、通過型では小数点以下4位までしか扱えないとのことで
 Doubleにしてました。
 御指摘のように通過型にすると正しく導出されます。型に格納するときに5位を四捨五入
 しているのでしょうか。
 さて、件の問題はINT関数でなく、エクセル関数のrounddownを使うと何故か解決しました。

お礼日時:2017/07/12 10:38

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

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報