準・究極の選択

int関数の切捨てがうまくいません。
類似の質問を検索して、試行錯誤しましたが、煮詰まってしまいました。
具体的には以下の内容です。

Dim wrkA As Currency
Dim wrkB As Currency

wrkA = 4935000
wrkB = Int(wrkA * 0.6)

wrkBに欲しい値は2961000、実際は2960999となってしまいます。

よろしくお願いいたします。

A 回答 (4件)

使用されている言語とバージョンは明記しましょう~。


文法よりVisualBasicと判断します。

当方環境:VisualBasic6.0 SP4

まず、下記のロジックを貼り付けて実行してみてください。

Private Sub Command1_Click()
Dim wrkA As Currency
Dim wrkB As Currency

wrkA = 4935000
MsgBox "TypeName = " & TypeName(Int(wrkA * 0.6))
End Sub

TypeName = Doubleと、でますよね?
これは0.6がDouble型で、これにあわせるために
暗黙の方変換が行われているからです。

0.6を通貨型で定義することにより、
暗黙の方変換を抑制することが出来ます。

Private Sub Command1_Click()
Dim wrkA As Currency
Dim wrkB As Currency

wrkA = 4935000
MsgBox "TypeName = " & TypeName(Int(wrkA * CCur(0.6)))
End Sub

ご参考になれば幸いです。
    • good
    • 0
この回答へのお礼

次回から言語等記入するように気を付けます。

ご指示通りで問題は解決できました。
ありがとうございました。

お礼日時:2004/10/28 13:26

肝心なことが抜けてました・・・・○| ̄|_ ガクッ



「0.6がDouble型で、これにあわせるために
暗黙の方変換が行われ浮動小数点計算になり
2960999という結果になる。」ということです。
    • good
    • 0

Currencyは通貨型ですから、小数点以下の端数も含みます。



ご質問の式は、単純に計算しても本来端数は発生しないはずなのですが
計算に用いている数値のデータ型が統一されていないため
暗黙の型変換などにより誤差が発生していると思われます。

wrkAがCurrency型ですから、Currency型同士で計算させるために

wrkB = Int(wrkA * CCur(0.6))

このように0.6をCurrency型に変換してから計算に用いる事で
誤差の発生を防ぐ事ができます。
    • good
    • 0

Currencyは整数型なのでInt関数を使う必要はありません。


なぜIntを使うと2960999になるのかはよく分かりませんが、
wrkB = wrkA * 0.6
で期待した計算結果を求めることができました。

wrkAが1000の倍数でないケースもあるのでしょうか。
    • good
    • 0

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

関連するカテゴリからQ&Aを探す