2011-07-01 11 views
2

私は現在、私を少し困惑させている問題があります。。ネット部門の丸め/小数点の差異

ここに背景があります:私たちは、asp.net 2.0ウェブアプリケーションを.net 4に64ビットサーバにアップグレードしています。新しいサーバーと古いサーバーの両方にデプロイされたテストアプリケーションを使用して、実際に動作する前に正常に動作することを確認します。どちらも別のサーバー上の同じデータベースを指しています。

は、ここで問題です:古いサーバーで

double totalGross; 
double totalNet = 9999999.00; 
float taxRate = 15.00f; 

totalGross = totalNet * (1 + (taxRate/100)); 

、totalGross上.ToString()が生成:新しいサーバーで11499998.85

を、totalGross上.ToString()が生成します。 11499998.6115814

現在のところなぜこのような可能性がありますか?後者の値では、最初の数は丸められていません。

ところで - 私はコードを修正/改良する方法を守っていません...これが起こる可能性のある理由の直後です!

更新

私は、コンソールアプリケーションを作成し、x86およびx64でそれを構築し、サーバー上で両方のバージョンを実行し、それが二つの異なる数字を出力します。したがって、実際には、doubleを使用すると、32ビットと64ビットの間で何らかの精度が失われるように見えます。問題の精度の喪失が0.2であることは私には驚くばかりです。これは私には正確ではないように見えます。誰かが提案したように、おそらく十進数型を使用するほうが良いでしょう(私の防衛では、このコードは書いていませんでした)。

+0

64bitと32bitの両方のマシンでこのコードを実行したところ、11499998.85という非常に奇妙なことです。 – Jethro

+1

これらの値を変更するものは何もありませんか? –

+0

暫定的に言えば、より適切な財務計算を使用してコードを実行する場合、どのような結果が観察されますか? –

答えて

2

古いサーバーは32ビットマシンでしたか? http://msdn.microsoft.com/en-us/library/system.double.aspx、特にparagrahp浮動小数点値と精度の損失をチェックしてください。あなたは新しいサーバーにプロセス32ビットを実行させることができますか?それは何かを変えますか?

+0

[署名やタグラインは含めないでください](http://stackoverflow.com/faq#signatures) –

0

"また、Double型の精度の損失により、Double値の算術演算と代入演算の結果がプラットフォームによって多少異なる場合があります。たとえば、Double型の値を代入した結果は32 .NET Frameworkの64ビット版と64ビット版の両方をサポートしています。以下から取ったLink

1

他の人が触れたように、プラットフォームは責任を負うことがあります。 しかし、私はDecimal型を使う方が良い選択かもしれないと思うし、Doubleと同じ問題を抱えているとは思わないでしょう。 (私が金融業界に関連して取り組んできたプロジェクトでは、金銭取引の計算に小数点を使用しています)。浮動小数点プラットフォームの問題については、浮動小数点プラットフォームに関する問題はありません。http://msdn.microsoft.com/en-us/library/system.decimal.aspx

関連する問題