- - PR -
Int関数について
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-03-25 11:59
VB6で開発をしております。
2つのテキストに入力された値を足し、その値に0.15をかけ、小数点を 切り捨てて単価を出しています。 小数点の切捨てのために、int関数を使用していますが、正常に動作を してくれないのでご教授お願いします コードは以下のようになっています rs!Tanka = Int((Val(txt_Front.Text) + Val(txt_Rear.Text)) * 0.15) txt_Front.Text=3178 txt_Rear.Text=1782 の場合、 Int((3178+1782)*0.15) なので744にならなければいけないはずが 743になってしまいます。 Int関数の使い方がおかしいのでしょうか? よろしくお願いします | ||||||||||||
|
投稿日時: 2008-03-25 12:06
こんにちは
(Val(txt_Front.Text) + Val(txt_Rear.Text)) * 0.15 の部分の計算を一旦Currency型の変数に代入してから Int(変数) だとできたような気がします。 | ||||||||||||
|
投稿日時: 2008-03-25 13:24
Currency でなくても良いですから変数に計算結果を格納しましょう。
これなら 744 になるハズです。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2008-03-25 13:42
CDblをかますのはどうでしょうか?
rs!Tanka = Int(CDbl((Val(txt_Front.Text) + Val(txt_Rear.Text)) * 0.15)) 追記 消費税計算だったら誤差はまずいのでCCurを使うのが妥当ですね。 rs!Tanka = Int(CCur((Val(txt_Front.Text) + Val(txt_Rear.Text)) * 0.15@)) [ メッセージ編集済み 編集者: Blue 編集日時 2008-03-25 13:47 ] | ||||||||||||
|
投稿日時: 2008-03-26 22:18
初めて書き込みさせていただきます。
もし、すでに解決されているのなら、読み飛ばしてください。
Int関数がおかしいのではなく、"0.15"が問題なのです。 VBやCなどのプログラミング言語は、内部では2進数で表現します。 "0.15"という小数は2進数で表現すると無限小数になるはずです。 したがって、"0.15"は、2進数表現では十進数表現の"0.15"より小さい値となります。
この式は、 rs!Tanka = (Val(txt_Front.Text) + Val(txt_Rear.Text)) * 15& / 100 というように、整数型だけで演算すれば、期待通りの結果となるはずです。 | ||||||||||||
|
投稿日時: 2008-03-27 09:56
VB.NET(Visual Studio 2003 および 2005)で同じコードを書いて試してみたのですが、
いずれも744.0という結果が得られました。
自分は2進数については理解しているつもりですが、 VB6だけ結果が違うのは他にも何か理由があるのではないでしょうか。 自分でも調べてみて以下の過去スレッドを見つけたりしたのですが、 原因についてはいまひとつよく理解していません。 http://hanatyan.sakura.ne.jp/logbbs1/wforum.cgi?mode=allread&no=3276&page=0 | ||||||||||||
|
投稿日時: 2008-03-27 15:54
まず、内部2進数表現で値を保持する小数を扱う場合、2進数←→10進数変換に伴う誤差の発生は起こりうるものだとしてコーディングすべきです。 すなわち、提示されたコードのように 0.15 をかけた段階で誤差が起こるかもしれないと考え、その誤差込みの微妙な値を Int で切り捨てるようなことはしないのが大前提です。Double 型を使わないとか、四捨五入のような丸めを使うとか、掛けて割るみたいなことをするなど、いろいろなテクニックはあります。 それとは別に、VB の挙動として、小数の値がなんか変ですね。 つぎのようなコードで試してみました。(VB5CCE を使用。)
すると、結果はつぎのようになりました。
すなわち、 c = a * b d = Int(c) と e = Int(a * b) で結果が異なるのです。 私も VB を長いこと使っていますが、良く分かりません。最適化云々のため? そもそも言語仕様が明確ではないため、Int(c) と Int(a * b) のなにが違うのか、や、a * b の型はなんなのか、が、分かりません。 | ||||||||||||
|
投稿日時: 2008-03-27 16:00
さきほど、このリンク先を読まずに書いてしまいましたが、そこに書いてありましたね。 私はVBの「バグ」(か、どうしようもないけったいな仕様)だと思います。 |