2012-03-15 19 views
1

可能性の重複:C#の10進数のラウンド

3.786444499963 

これに:そのようなポイントの後の長い休みで小数を返す方法
c# - How do I round a decimal value to 2 decimal places (for output on a page)

3.787 

そのわずか数

+4

あなたはそれが間違った方法であることを知っていますよね?正しい方法は、単純に4桁の10進数字(この場合)を見ることです。 – xanatos

+0

私の答えを試しましたか? –

+0

@ xanatosもしあなたがバンカーの丸めをしているなら、4桁目を見る必要があり、5ならば4桁目以降にゼロ以外の桁があるかどうかを調べる必要があります。 – phoog

答えて

4

の残りの部分の周りにも、ポイントにそれをカットしかし3.786444499963 3に小数点以下の一般的に受け入れられて丸めが3.786ではありません。なぜあなたは別の理由で考えるのですか?したがって

var round = Math.Round(3.786444499963m, 3, MidpointRounding.AwayFromZero); 
Console.WriteLine(round == 3.786m); // prints true 

あなたはそれは常に切り上げしたい場合:

var round = Math.Round(3.786444499963m + 0.0005m, 3); 
Console.WriteLine(round == 3.787m); // prints true 

あなたは私がそこに何をしたか見ていますか? Math.Roundを使用する前に入力に0.0005mを追加しました。一般的には、醜いdouble/decimal変換を避けるために、xnに小数点以下の桁、おそらく

var round = Math.Round(x + 5m * Convert.ToDecimal(Math.Pow(10, -n - 1)), n); 

かを、四捨五入する:

int k = 1; 
decimal value = 5m; 
while(k <= n + 1) { value /= 10m; k++; } 
var round = Math.Round(x + value, n); 

は、あなたが知っておく必要があるエッジケースがあります。 3.786はどうなりますか? 3.787に切り上げるか、3.786にするか?あなたは正確に何をしたいのかを指定していないので、私はこの端をあなたに残します。

+0

私はAssertを取得する必要がありますか? –

+0

'Assert'を無視してください。それはあなたが望む動作を生み出すことを示しているだけです。 'Console.WriteLine'でも同じことが分かります。 – jason

+0

はい、ありがとうございます。簡単な監視。 – jason

0
RoundUp(3.786444499963M, 3); 

    static decimal RoundUp(decimal dec, int precision) 
    { 
     decimal rounder = (decimal)(0.5 * Math.Pow(10, -precision)); 
     return Math.Round(dec + rounder, precision); 
    } 
+2

3.786を返します。 Math.Roundは最後の桁から「カスケード」しません。それは単に数字の位置+ 1を見ます – xanatos

+0

私はそれを丸める必要があります –

+0

@ roy.d:ラウンドする3つの主な方法があります。例えば、小数点以下を四捨五入します。丸めの場合、近似は最も近い整数になります(0.3→0; 0.7→1)。 Ceilでは、aproximationは常に最も近い上位の整数(0.3 - > 1; 0.7 - > 1)であり、Floorとの関係は常に最も近い下位の整数(0.3 - > 0; 0.7 - > 0)です。これらのうちどれが必要ですか? –

5
Math.Ceiling(3.786444499963 * 1000)/1000; 
+0

おかげで両方の答えが働いています: Math.Ceiling(3.786444499963 * 1000)/ 1000; および Math.Round(3.786444499963m + 0.0005m、3); –