問題は、0.575を正確に2進浮動小数点数(doubleなど)で表すことができないことになります。私はちょうどそれが最も近い表現はちょうど少し低いと思われることを正確にはわからないが、それを丸めるときには真の表現を使用して切り捨てる。
この問題を回避するには、より適切なデータ型を使用します。 decimal
はあなたがやりたいことになります。
Math.Round(0.575M, 2, MidpointRounding.AwayFromZero)
結果:0.58
0.75が正しいことがないという理由は、簡単であるため2進浮動小数点で表現するために簡単なことです
1/2 + 1/4(すなわち、2^-1 + 2^-2)である。一般に、2のべき乗の任意の有限和は、2進浮動小数点で表現することができる。例外は、2の威力が大きすぎる範囲(例えば、2^100 + 2が正確に表現できない場合)です。
編集、追加する:
Formatting doubles for output in C#は0.575が本当に0.575ではないことを理解し、なぜその一生懸命理解するという点で関心があるかもしれません。受け入れられた答えのDoubleConverterは、正確な文字列として0.575が0.5749999999999999555910790149937383830547332763671875
であることを示します。丸めが0.57を与える理由は、これから分かります。
[この質問の最初の回答](http://stackoverflow.com/q/5641616/62576)がこの回答に役立ちます。 –
@KenWhite:それは確信しています。問題は、実際の数学が '.575'をゼロから2桁小数点以下に丸めると' .58 'が出るが、これは観測結果ではないという問題がある。この場合、浮動小数点表記と関係がある。 – Chris
@Chris:そうです。 :-)私は主にDelphiを使用しています。Round()は、このような処理を大部分はうまく処理します。私はちょうどC#でチェックして、問題を見ることができます。 –