2

2桁のdouble値に4桁の小数点(ソリューションで要求される)を追加しようとすると、奇妙なことが起こりました。

不正な値:

    var result = string.Format("{0:#,0.0000}", Math.Truncate(2.03*10000)/10000);

//2.0299を返します

正しい値:

    var result = string.Format("{0:#,0.0000}", Math.Truncate(2.02*10000)/10000);

//2.0200を返します

と:

    var result = string.Format("{0:#,0.0000}", Math.Truncate(2.04*10000)/10000);

//2.0400を返します

なぜこれが2.03でのみ発生するのか考えてみてください。入力値として12.03は12.0300btwを返します。

迷っています。助けてください。

4

4 に答える 4

2

ここでは、10000を掛けて10000で割る意味はありません。ここに表示されているようなわずかなエラーが発生するリスクがあるだけです。doubleとfloatは2を底とする表現を使用するため、任意の10進数を正確に表すことはできないことに注意してください。

これはあなたが望むものをあなたに与えるでしょう:

String.Format("{0:#,0.0000}", 2.03)

10進数で完全な精度が必要な場合は、代わりに10進数タイプを使用してください。

于 2013-01-28T14:57:55.657 に答える
1

これは精度の低下であり、特定の状況下では大した問題ではありません。次のような10進タイプを使用してみてください。

var result = string.Format("{0:#,0.0000}", Math.Truncate(2.03m*10000m)/10000m);
于 2013-01-28T14:56:49.183 に答える
0

数値2.03は、2進数として表されます。これは、正確に格納できないことを意味します。これにより、切り捨てによって修正されない丸め誤差(たとえば、小数点以下15桁)が発生する可能性があります。

数値を四捨五入すると、問題を回避できます。

于 2013-01-28T14:54:05.477 に答える
0

以下のコードを試してください....それはあなたを助けます...

        var result = Decimal.Add(Convert.ToDecimal(2.03 * 10000 / 10000), .0000m);
        //Results 2.0300

        var result = Decimal.Add(Convert.ToDecimal(2.02 * 10000 / 10000), .0000m);
        //Results 2.0200

        var result = Decimal.Add(Convert.ToDecimal(2.04 * 10000 / 10000), .0000m);
        //Results 2.0400

        var result = Decimal.Add(Convert.ToDecimal(12.03 * 10000 / 10000), .0000m);
        //Results 12.0300
于 2013-01-28T15:06:23.813 に答える