• ベストアンサー

Access のInt関数が変?

Access2002 windows2000 仮に フォーム名:計算フォーム テキストボックス名:txt答え コマンドボタン:cmd実行 を作ります。 cmd実行をクリックしたとき次の計算を実行さします。 Me![txt答え]=Int(500000*(29.2/100/365)*36) すると txt答え に表示されるのは 14399です。 小数点以下はない筈ですのに切り捨てられたような結果が出てきます。 クエリのビルドを使って計算式を記述し計算さすと 14400になります。 エクセルで試しても 14400になります。 とても悩んでいます。 どちら様か教えていただけませんか?

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

  • ベストアンサー
  • paz777
  • ベストアンサー率47% (77/163)
回答No.3

こんにちは。 私も小数点以下の誤差には悩まされました。 で、誤差を無くすには、計算結果を[貨幣型]の変数に一度格納するとうまくいきます。 (ヘルプで[Fieldsize]を検索して、一番最後の[ヒント]を参照してください) こちらで確認した内容 ---------------------------------------------------------------------- Dim ANS_1 As Currency ' ANS_1 = 500000 * (29.2 / 100 / 365) * 36 Me![txt答え] = Int(ANS_1) Me![txt答え1] = ANS_1 Me![txt答え2] = 500000 * (29.2 / 100 / 365) * 36 Me![txt答え3] = Int(500000 * (29.2 / 100 / 365) * 36) - _ (500000 * (29.2 / 100 / 365) * 36) Me![txt答え4] = ANS_1 - (500000 * (29.2 / 100 / 365) * 36) 各値の結果 Me![txt答え] :14400 Me![txt答え1]:14400 Me![txt答え2]:14400 Me![txt答え3]:-0.99999999999965 Me![txt答え4]:0 ---------------------------------------------------------------------- または、全ての要素を[貨幣型]の変数にしても良いようです。 ---------------------------------------------------------------------- Dim SET_1 As Currency Dim SET_2 As Currency Dim SET_3 As Currency Dim SET_4 As Currency Dim SET_5 As Currency Dim ANS_1 As Currency ' SET_1 = 500000 SET_2 = 29.2 SET_3 = 100 SET_4 = 365 SET_5 = 36 ANS_1 = SET_1 * (SET_2 / SET_3 / SET_4) * SET_5 Me![txt答え] = Int(ANS_1) Me![txt答え1] = ANS_1 Me![txt答え2] = SET_1 * (SET_2 / SET_3 / SET_4) * SET_5 Me![txt答え3] = Int(SET_1 * (SET_2 / SET_3 / SET_4) * SET_5) - _ (SET_1 * (SET_2 / SET_3 / SET_4) * SET_5) Me![txt答え4] = ANS_1 - (SET_1 * (SET_2 / SET_3 / SET_4) * SET_5) 各値の結果 Me![txt答え] :14400 Me![txt答え1]:14400 Me![txt答え2]:14400 Me![txt答え3]:0 Me![txt答え4]:0 ---------------------------------------------------------------------- ではでは・・・

siba10
質問者

お礼

ご回答有難うございます。 大変参考になりました。 早速試してみます。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • peso
  • ベストアンサー率41% (40/97)
回答No.4

他の型の回答のように、小数を扱うと誤差が生じることがあります。 また、#3の方のようにすべて、通貨型にすることで誤差はなくなります。 そこで通貨型を使うのですが、具体的な数値であれば@で通貨型、というような指定が出来ます。 Me![txt答え]=Int(500000@ * (29.2@ / 100@ / 365@) * 36@) これで誤差が出なくなります。ただ、通貨型は小数点以下は4桁しか扱えません。 ちなみに、Roundは、ExcelのROUND(四捨五入する関数)とは少し違う関数です。

siba10
質問者

お礼

ご回答有難うございます。 すべて通貨型にすることで誤差はなくなり解決しました。

すると、全ての回答が全文表示されます。
  • ranx
  • ベストアンサー率24% (357/1463)
回答No.2

内側の括弧の中を計算すると0.0008になりますよね。 これを二進数で表すと無限に続く少数となります。ですから、有限の小数で表せば必ず 切り捨てられる部分が出てきます。これが最後まで計算しても尾を引いていて、きっちり した数にならなかったのだと思います。 Me![txt答え]=Int(500000*36/(365*100*10/292)) としたらどうでしょう。

siba10
質問者

お礼

ご回答有難うございます。 大変参考になりますが有限の小数の意味がいまいちわかりません。 Me![txt答え]=Int(500000*36/(365*100*10/292)) 説明のためこの値にしたのですが、この値は365と100は変化しませんが500000、36、29.2は変化するのですが、この式にするとどのような値でも有限の小数となるのでしょうか?

すると、全ての回答が全文表示されます。
  • h_sakaki
  • ベストアンサー率18% (175/970)
回答No.1

INT関数は切り捨てです。 また、電卓で計算しても、計算順序によっては端数が出ます。 ちなみに500000/365を先に計算すると、1439.999999になりました。 また、計算機内では十進で計算するのではなく二進で計算するので、変換誤差が生じますので、INTは通常使用しません。エクセルではROUNDを使用するのですが、アクセスでもあるかどうかは、自信有りません。

siba10
質問者

お礼

早速ご回答いただき有難うございます。 計算順序によって端数が出るとは気がつきませんでした。 調べてみますとROUNDがありました。

すると、全ての回答が全文表示されます。

関連するQ&A