2012-03-29 13 views
7

C#では、丸めを行わずに最後の小数点以下2桁を取得しようとしています。私はMath.FloorからMath.Truncateにすべてを試みたが、何も動作していない。私が好きな結果の丸みのない最後の小数点以下2桁を取得する

サンプル:

1,424.2488298 -> 1,424.24 
53.5821 -> 53.58 
10,209.2991 -> 10,209.29 

任意のアイデア?

+1

あなたがしている場合* decimal *で作業している場合、なぜ* decimal *を使用できる場合は* double *を使用していますか? –

+0

あなたはこの投稿に行き、あなたに合ったものを見つけることができますhttp://how-to-code-net.blogspot.ro/2012/09/how-to-format-number-to-x-decimal.html –

答えて

22

まあ、数学的にそれは簡単です:

var f = 1.1234; 
f = Math.Truncate(f * 100)/100; // f == 1.12 

移動し、切り捨てる左二つの場所に戻ってそれをシフトするためにint型にキャスト右に小数点以下2桁は、。フレームワークにもそれを行う方法があるかもしれませんが、私は今見ていません。あなたはそれを一般化できます。

double Truncate(double value, int places) 
{ 
    // not sure if you care to handle negative numbers...  
    var f = Math.Pow(10, places); 
    return Math.Truncate(value * f)/f; 
} 
+0

それほど単純ではありません。 doubleはintよりも広い範囲を保持します。 – Joe

+0

@joe:ああ、良い点は、代わりにMath.Truncateを使用し、キャストは必要ありません。 –

+0

@EdS。私はあなたの最初の方法を使用して値136.2025でこれを試して、それを136.2にトリムして0を落としました。そこに0を保持する方法はありますか? – mint

5
double d = Math.Truncate(d * 100)/100; 
2

一般解:

public static double SignificantTruncate(double num, int significantDigits) 
    { 
     double y = Math.Pow(10, significantDigits); 
     return Math.Truncate(num * y)/y; 
    } 

その後

double x = 5.3456; 
    x = SignificantTruncate(x,2); 

望ましい結果x=5.34を演出します。

14

私の助言:は、最初にdoubleを使用して停止します。小数点以下の四捨五入が必要な場合は、オッズは良いです。decimalを使用する必要があります。あなたのアプリケーションは何ですか?

あなたはダブルを持っている場合は、このようにそれを行うことができます。ダブルの絶対値が792281625142643375935439504より大きければ100による乗算が失敗するので、この技術は、失敗します

double r = whatever; 
decimal d = (decimal)r; 
decimal truncated = decimal.Truncate(d * 100m)/100m; 

に留意されたいです。 。大きい値を処理する必要がある場合は、特別なテクニックを使用する必要があります。 (もちろん、時間によって二重のは大きなことを、あなたはとにかく小数点以下2桁の数値を表現する能力をはるかに超えているされています。)

2
Math.Round(NumberToRound - (double)0.005,2) 

すなわち

Math.Round(53.5821 - (double)0.005,2) // 53.58 
Math.Round(53.5899 - (double)0.005,2) // 53.58 
Math.Round(53.5800 - (double)0.005,2) // 53.58 
関連する問題