- ベストアンサー
int関数の切り上げ
int関数の切捨てがうまくいません。 類似の質問を検索して、試行錯誤しましたが、煮詰まってしまいました。 具体的には以下の内容です。 Dim wrkA As Currency Dim wrkB As Currency wrkA = 4935000 wrkB = Int(wrkA * 0.6) wrkBに欲しい値は2961000、実際は2960999となってしまいます。 よろしくお願いいたします。
- みんなの回答 (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 ご参考になれば幸いです。
その他の回答 (3)
肝心なことが抜けてました・・・・○| ̄|_ ガクッ 「0.6がDouble型で、これにあわせるために 暗黙の方変換が行われ浮動小数点計算になり 2960999という結果になる。」ということです。
- chairwarmer
- ベストアンサー率41% (163/393)
Currencyは通貨型ですから、小数点以下の端数も含みます。 ご質問の式は、単純に計算しても本来端数は発生しないはずなのですが 計算に用いている数値のデータ型が統一されていないため 暗黙の型変換などにより誤差が発生していると思われます。 wrkAがCurrency型ですから、Currency型同士で計算させるために wrkB = Int(wrkA * CCur(0.6)) このように0.6をCurrency型に変換してから計算に用いる事で 誤差の発生を防ぐ事ができます。
- ta123
- ベストアンサー率51% (95/186)
Currencyは整数型なのでInt関数を使う必要はありません。 なぜIntを使うと2960999になるのかはよく分かりませんが、 wrkB = wrkA * 0.6 で期待した計算結果を求めることができました。 wrkAが1000の倍数でないケースもあるのでしょうか。
お礼
次回から言語等記入するように気を付けます。 ご指示通りで問題は解決できました。 ありがとうございました。