ちょっと先の未来クイズ第4問

Access2002 windows2000

仮に フォーム名:計算フォーム テキストボックス名:txt答え コマンドボタン:cmd実行 を作ります。

cmd実行をクリックしたとき次の計算を実行さします。

Me![txt答え]=Int(500000*(29.2/100/365)*36)

すると txt答え に表示されるのは 14399です。
小数点以下はない筈ですのに切り捨てられたような結果が出てきます。

クエリのビルドを使って計算式を記述し計算さすと 14400になります。
エクセルで試しても 14400になります。

とても悩んでいます。
どちら様か教えていただけませんか?

A 回答 (4件)

こんにちは。



私も小数点以下の誤差には悩まされました。
で、誤差を無くすには、計算結果を[貨幣型]の変数に一度格納するとうまくいきます。
(ヘルプで[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
----------------------------------------------------------------------

ではでは・・・
    • good
    • 0
この回答へのお礼

ご回答有難うございます。

大変参考になりました。
早速試してみます。

お礼日時:2002/05/24 12:47

他の型の回答のように、小数を扱うと誤差が生じることがあります。


また、#3の方のようにすべて、通貨型にすることで誤差はなくなります。
そこで通貨型を使うのですが、具体的な数値であれば@で通貨型、というような指定が出来ます。

Me![txt答え]=Int(500000@ * (29.2@ / 100@ / 365@) * 36@)

これで誤差が出なくなります。ただ、通貨型は小数点以下は4桁しか扱えません。

ちなみに、Roundは、ExcelのROUND(四捨五入する関数)とは少し違う関数です。
    • good
    • 0
この回答へのお礼

ご回答有難うございます。

すべて通貨型にすることで誤差はなくなり解決しました。

お礼日時:2002/05/24 14:19

内側の括弧の中を計算すると0.0008になりますよね。


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

ご回答有難うございます。

大変参考になりますが有限の小数の意味がいまいちわかりません。

Me![txt答え]=Int(500000*36/(365*100*10/292))
説明のためこの値にしたのですが、この値は365と100は変化しませんが500000、36、29.2は変化するのですが、この式にするとどのような値でも有限の小数となるのでしょうか?

お礼日時:2002/05/24 12:46

INT関数は切り捨てです。


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

早速ご回答いただき有難うございます。

計算順序によって端数が出るとは気がつきませんでした。
調べてみますとROUNDがありました。

お礼日時:2002/05/24 08:55

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

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


おすすめ情報

このQ&Aを見た人がよく見るQ&A