アプリ版:「スタンプのみでお礼する」機能のリリースについて

VB6のFIX関数を使用すると次の事象が発生しました。
私自身で制限事項等を調べてみたのですが、探す事が
できませんでした。FIX関数へは、DOUBLE型の数値また
は数式を入れる構文となっていますが、今回はDOUBLE型
への明示的な変換は行っていませんでした。しかし、VB6
はデータ型をあまり意識しなくても良い仕様の言語である
ので内部的にDOUBLE型へ変換しているのであれば誤差が
あるのは矛盾していると思います。
マイクロソフトのサポートもVB6については終了している
ので個人的に聞いてもだめでした。
また、VS2005で同じFIX関数を試してみると正確な値が戻
ってきました。
以上、よろしくお願いします。

FIX(7520*0.15) を実行すると「1127」が表示されます。
実際は、「1128」なのですが1円の誤差が発生します。
FIX(DOUBLE(7520*0.15))を実行すると「1128」が表示され
ます。
※ 実行環境 OS:Windows XP SP2、
Visual Basic Ver 6 Professional SP5

A 回答 (3件)

つい最近似たような質問をどこかで見かけたと思ったら以下の所にありましたので


こちらもご覧になってみてはいかがでしょうか。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.ph …
    • good
    • 0
この回答へのお礼

ありがとうございました。
リンク先も大変参考になりました。

お礼日時:2008/06/12 18:12

コンピュータの演算誤差については、下記ページが参考になるかと


(探せば、もっといいサイトもあると思うが^^;)
http://www.geocities.co.jp/SiliconValley/4334/un …
    • good
    • 0
この回答へのお礼

参考になりました。
ありがとうございました。

お礼日時:2008/06/12 18:21

確かに 即値で書いた場合は誤差が発生するようです


Fix( 7520 * 0.15 ), Fix(CDbl(7520) * 0.15 ), Fix( 7520 * CDbl(0.15))
すべて 1127でした

0.15を 通貨型(Currency)にして計算計算してやると上手くいきます
また 最初に Double型の変数に代入してからFixに渡すと 1128を返すようです

どこかで精度落ちしてるのでしょう
CDbl(7520) * CDbl(0.15) - CDbl( 7520* 0.15 ) を実行すると
-4.17443857259059E-14 といった微小な誤差が出ているようです
    • good
    • 0
この回答へのお礼

ありがとうございました。
7520はCurrencyにしていたのですが、
0.15は定数にしていたのでDouble型の
変数となっていた為の誤差でしょうか。
修正して確認してみます。

お礼日時:2008/06/12 18:15

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