• ベストアンサー

int関数の切り上げ

int関数の切捨てがうまくいません。 類似の質問を検索して、試行錯誤しましたが、煮詰まってしまいました。 具体的には以下の内容です。 Dim wrkA As Currency Dim wrkB As Currency wrkA = 4935000 wrkB = Int(wrkA * 0.6) wrkBに欲しい値は2961000、実際は2960999となってしまいます。 よろしくお願いいたします。

  • onyu
  • お礼率44% (4/9)

質問者が選んだベストアンサー

  • ベストアンサー
noname#20982
noname#20982
回答No.2

使用されている言語とバージョンは明記しましょう~。 文法より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 ご参考になれば幸いです。

onyu
質問者

お礼

次回から言語等記入するように気を付けます。 ご指示通りで問題は解決できました。 ありがとうございました。

その他の回答 (3)

noname#20982
noname#20982
回答No.4

肝心なことが抜けてました・・・・○| ̄|_ ガクッ 「0.6がDouble型で、これにあわせるために 暗黙の方変換が行われ浮動小数点計算になり 2960999という結果になる。」ということです。

回答No.3

Currencyは通貨型ですから、小数点以下の端数も含みます。 ご質問の式は、単純に計算しても本来端数は発生しないはずなのですが 計算に用いている数値のデータ型が統一されていないため 暗黙の型変換などにより誤差が発生していると思われます。 wrkAがCurrency型ですから、Currency型同士で計算させるために wrkB = Int(wrkA * CCur(0.6)) このように0.6をCurrency型に変換してから計算に用いる事で 誤差の発生を防ぐ事ができます。

  • ta123
  • ベストアンサー率51% (95/186)
回答No.1

Currencyは整数型なのでInt関数を使う必要はありません。 なぜIntを使うと2960999になるのかはよく分かりませんが、 wrkB = wrkA * 0.6 で期待した計算結果を求めることができました。 wrkAが1000の倍数でないケースもあるのでしょうか。

関連するQ&A

  • Excel Vbaの関数Intの機能について

    Excel Vbaでの関数Intの機能について教えてください ある特定の値についての処理が私の予想に反した動きをします。私の理解が浅いと思うのですがその理由が分かりません。 Vbaでプロシジャーを作ってみました。ともに小数0.3を10倍し、 その値とIntの値を比較しています。コードの違いは(1)と(2)です。 Public Sub Test1() Dim dblNum1 As Double, dblNum2 As Double dblNum1 = 0.2 dblNum1 = dblNum1 + 0.1 ……(1) dblNum2 = dblNum1 * 10 Debug.Print "Int(dblNum2) = " & Int(dblNum2); " : dblNum2 = " & dblNum2 Debug.Print "差(Test1):" & dblNum2 - Int(dblNum2) End Sub Public Sub Test2() Dim dblNum1 As Double, dblNum2 As Double dblNum1 = 0.3 ' dblNum1 = dblNum1 + 0.1 ……(2)コメントにしています dblNum2 = dblNum1 * 10 Debug.Print "Int(dblNum2) = " & Int(dblNum2); " : dblNum2 = " & dblNum2 Debug.Print "差(Test2):" & dblNum2 - Int(dblNum2) End Sub 実行結果は次のようになりました。 Test1の結果 Int(dblNum2) = 3 : dblNum2 = 3 差(Test1):4.44089209850063E-16 Test2の結果 Int(dblNum2) = 3 : dblNum2 = 3 差(Test2):0 差(Test1)がなぜ0にならないのか不思議な気がします(当たり前なのかな?)。 0.8についても同様な結果になります。 その他の値0.1 ~ 0.9では、私の予想通り、差(Test1)、差(Test2)ともに0になります。 ネットなどで検索したら、浮動小数点の扱いに関係がありそうだなのかなぐらいは想像できるのですが具体的な仕組みはよく分かりません。 この疑問に至った背景について、説明します。 Int関数の機能については特段興味はなかったのですが、「有限小数の小数点以下の桁数を調べる関数」を作るのに利用していました。その関数では、なぜか特定の小数についてはうまく機能しませんでした。調べていくうちに上記のような現象に気づきました。 話がそれて厚かましいお願いになりますが、「有限小数の小数点以下の桁数を調べる関数」のコーディングの例を教えていただけないでしょうか。私が作った関数は以下のようになります。これについてもアドバイスをいただければ大変助かります。   Public Function FiniteDCPlace(dblR As Double, intMax As Integer) As Integer '機能:小数点以下の何桁の有限小数になるか、その桁数を調べる。 '引数:dblRは小数、intMax は調べる最大の桁数 ただしintMaxは7以下の値 '戻り値:小数点以下の桁数がintMax以下の有限小数の場合、その桁数 ' それ以外は「-1」 Dim i As Integer Dim dblNum As Double If intMax > 7 Then FiniteDCPlace = -1 Exit Function Else 'No Ope End If dblNum = dblR FiniteDCPlace = -1 For i = 0 To intMax Debug.Print "Int(dblNum) = " & Int(dblNum) & " : dblNum = " & dblNum Debug.Print "差(FiniteDCPlace):" & dblNum - Int(dblNum) If Int(dblNum) = dblNum Then FiniteDCPlace = i Exit For Else dblNum = dblNum * 10 FiniteDCPlace = -1 End If Next End Function 次のプロシジャーでチェックしました。 小数 0.028 のとき3ではなく、-1を返します。 Private Sub testFiniteDCPlace() Dim intNum As Integer Dim dblNum As Double Dim i As Integer dblNum = 0.028 ‘予想外の結果になる intNum = FiniteDCPlace(dblNum, 7) Debug.Print dblNum & " の桁数 : " & intNum dblNum = 0.027 ‘予想通りの結果になる 3になる intNum = FiniteDCPlace(dblNum, 7) Debug.Print dblNum & " の桁数 : " & intNum End Sub ちなみに、環境はOS Widows10 、Excel2013 です。 以上よろしくお願いします。 質問の内容を書いてください

  • 【Excel:VBA】千円未満切捨ての方法

    1000未満切捨てのVBA関数はどの関数を使いどのように引数を指定すればよいのかわかりません。 ------------------------------- Sub 切捨て() Dim x As Integer x = 123456 〔切捨て関数〕 MsgBox x End Sub -------------------------------- この状態で、メッセージボックスに「123000」の値が表示されるようにできないでしょうか? 小数点以下を切り捨てるには x = Int(x) だとわかったのですが、この関数に千未満切捨てなどを指定する引数はあるのでしょうか?

  • Access97 Int関数

    小数点の切り捨てをしたくてクエリーで 以下の計算をしてみました。 =Int([個数]*[単価]) ところが以下の数値で計算させると結果が 50232となると思うのですが50231となってしまいます。 数量:460 単価:109.2 結果:50231(電卓で計算すると50232) 結果が小数点になるときは問題ないようです。 使い方が間違っているのでしょうか。 こういう場合Int関数を使うのが誤りなのでしょうか? だとしたら他に当てはまる関数があるのでしょうか? ちなみにテーブルの定義としては 数量:長整数型(小数点以下桁数0) 単価:単精度浮動小数点型(小数点以下桁数0) となっていますが小数点は表示されています。

  • ADOで算術型のRound関数を使いたい

    お世話になっております。 ACCESSではRound関数を使うと銀行型で計算してしまうので、算術型で計算するため以下のような定義関数をACCESS上で作成しました。 Public Function Round(X As Currency, s As Integer) As Currency Dim t As Integer t = 10 ^ Abs(s) If s > 0 Then Round = Int(X * t + 0.5) / t Else Round = Int(X / t + 0.5) * t End If End Function この関数を使えばACCESS上でクエリを見た時にはちゃんと算術型の計算結果が表示されるのですが、ADOを使ってExcelで読み込んだ時にはなぜか銀行型の計算結果が表示されていしまいます。 "Round"という関数名が良くなかったのかと思い、"Round2"という関数に変更したところ、ACCESS上は問題なかったのですが、ADOで読み込んだ時に"未定義の関数があります"とエラーが出てしまいました。 ADOで読み込んでも算術型のRound関数で計算するような方法はないでしょうか。

  • エクセルの関数について教えてください。

    以下のような計算をしたいです。 係数 0.417 値 100000 期間 3 100000*0.417=41700 41700*0.417=17388(切捨て) 17388*0.417=7250(切捨て)←答え 答えが切捨てじゃなければPOWER関数でいけると思うのですが 各期で切り捨て計算をできる関数があれば教えてください。 よろしくお願いします。

  • エクセル関数について教えてください。

    (A5,A8,A11,A14,A17)のセルの値の中から、一番高い値を検索したい時にどんな関数を使ったらいいのでしょうか? largeを使ってみたのですが、セルが続いている場合でないと使えないみたいでした。。。 表の形を変えれば済むことなのですが、できるだけ変えないようにできないかな~と試行錯誤しております。 何か良いアドバイスがありましたら、よろしくお願いします。

  • Rnd関数って

    VBのRnd関数を使って次のようにフォーム上に値を返させたときに疑問が沸いたのですが。 sub イベント() Dim Data As Single Randomize Data = Rnd() Text1.Text = Data Text2.Text = Int(Data * 100) end sub この何回かイベントを実行すると例えば text1  text2 0.367   36 0.782   78 8.591   8 の様に値が返されてきます。 ここで2つ不思議なのが HELPでRnd関数を調べると、0以上1未満の範囲の値を返します。となっているのに、なぜ8.591の様な値が出てくるのか? さらに8.591を100かけて小数点以下切り捨てると859になるはずが、なぜ8になるのか? 理由がわかる方教えてください。

  • ζ関数 に 虚数単位 (√-1) を代入したときの値を教えてください。 

    ζ関数を解析接続して複素平面上に展開できることは理解できるのですが、いざ具体的な値を求めるなると茫然自失となってしまいます。 フーリエ級数を使うということはわかっても実践経験がないので、どう試行錯誤したらいいのか、困っています。 そこで、試しに計算し易いであろう、√-1 を代入したときの、ζ関数の値の求め方、および、その値を教えて頂けると、複素平面上に展開されたζ関数の有り様の一端がわかると思うのです。 どなたか教えて頂けると幸いです。  

  • ExcelのINT関数の計算結果がおかしい。

    ExcelのINT関数というよりも表計算ソフトのINT関数で 1, INT((4.645*100-464)*10)の結果は4 2, INT((464.5-464)*10)の結果は5 3, INT((4.745*100-464)*10)の結果は5 4, INT((474.5-464)*10)の結果は5 になってしまいます、これはWIn版Excel2000,2002,2007,Mac版2004 openoffice.org 2.2 google のスプレッドシート ExcelのVBAで同じ結果になりました。VB2005では1も結果が5になります。 ここで検索したところでは表計算ソフトは循環小数になった場合14桁で四捨五入するというようなことが書かれていますが、この場合4.645*10と464.5の違いだけなのでそれも当てはまらないように思えるのですが、また1と3で違いが内容に思えるのですが、どうしてこのようなことが起こるのでしょうか。教えてください。

  • vba 自作関数

    Function zei(myRng As Range) As Double Dim c As Range Dim goukei As Double 'Volatileについて 'シート内のどこかのセルを参照しているものとする 'シートのどこかに変更があったらそのセルが自動的に再計算される Application.Volatile goukei = Application.WorksheetFunction.Sum(myRng) zei = Int(goukei * 5 / 100) End Function これを標準モジュールに貼り付けてワークシート上で関数を呼び出し、 100を入れると#VALUE!が返るのですがどうしてでしょうか? 違う値を入れても必ず#VALUE!が返ります。