- - PR -
VB6とVB2005での計算結果の違い
«前のページへ
1|2|3
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-06-03 09:49
今更ですが、私が書いた内容に「decimalでは誤差がない」など、大嘘な発言が含まれていることをお詫びします m(_ _)m
こちらに関して、参考になるBlogのエントリがありましたので貼っておきます。 http://blogs.wankuma.com/nakap/archive/2008/06/03/141021.aspx
の未記入さんの発言に全面的に同意します。 1点だけ補足すると、偶数丸めではない、いわゆる四捨五入をおこなう場合はMath.Round(double, MidpointRounding.AwayFromZero) または Math.Round(decimal, MidpointRounding.AwayFromZero) を使ってください。(VB2005以降で使えます) | ||||||||
|
投稿日時: 2008-06-03 11:07
これで合点がいきました。 V6.0ではCPU内部で80bit浮動小数点で計算しているので、計算結果をDouble型変数に格納するときに64bit浮動小数点へと丸目がおこなわれるのですね。その過程で125に変換されるのでしょう。 VB.NETでは64bit浮動小数点数のまま演算されるので、変数に格納するときに丸めはおこなわれず、124.xxxxxxxxxと言う値になる。その後小数点以下を切り捨てると124になると。 dbl金額 = Fix((CSng )((dbl単価 * dbl数量.ToString) / 1000)) とすれば、たぶんVB6と同じ演算結果になるでしょう。 一番良いのはこの機会に仕様バグを直すことだとおもうな。 dbl金額 = (単価 * 分母 / 1000 * 分子)ってな感じ。 _________________ 甕星 <mikahosi@abox9.so-net.ne.jp> http://blogs.msmvp.jp/mikahosi/ | ||||||||
|
投稿日時: 2008-06-03 11:15
多分に勘が含まれるのですが、
ここは、
とするといい感じの結果になるのかなぁ、と思いました。 | ||||||||
|
投稿日時: 2008-06-03 12:20
dbl金額 = (単価 * 分子) / (1000 * 分母)ってな感じ。じゃなくてですか? #スレッド斜め読みなので見当違いだったらスルーして下さい。 |
«前のページへ
1|2|3