2016-09-27 11 views
1

これらの2つの簡単なコードと出力の違いを見てください。それは別の出力を与える同じ入力123.456なぜC#ではMath.Roundの丸めとプレースホルダの丸めの違いがありますか?

using System; 

namespace _02.CircleArea 
{ 
    class CircleArea 
    { 
     static void Main(string[] args) 
     { 
      double inputR = double.Parse(Console.ReadLine()); 
      double circleArea = (Math.PI * inputR * inputR); 
      Console.WriteLine("{0:F12}", circleArea); 
     } 
    } 
} 

using System; 

namespace _02.CircleArea 
{ 
    class CircleArea 
    { 
     static void Main(string[] args) 
     { 
      double inputR = double.Parse(Console.ReadLine()); 
      double circleArea = Math.Round((Math.PI * inputR * inputR), 12); 
      Console.WriteLine("{0}", circleArea); 
     } 
    } 
} 

123.456の入力と出力が47882.2198038791

そして、それをやっての方法です47882.219803879100

プレースホルダ丸めとMath.Round丸め結果の違いは何ですか?

+0

@CodeCaster:この質問で説明した相違点はここでは見られません。 –

+2

{0}から取得するデフォルトの書式設定では、表示される結果の有効数字が15桁を超えないようにします。 moreを表示するのはナンセンスなので、* double *型はその多くの桁を格納できません。その仮数には53ビットを使用し、2^53個の異なる値しか表現できません。 F12を使用するとナンセンスルールを無効にし、17桁を取得します。最後の2つはランダムノイズですが、あなたは0であることは不運です。それは事故であることがあります。 –

答えて

2

Math.Roundは実際には新しい数値を与えますが、フォーマットコードを使用するとの場合はの値が四捨五入されます。 2番目の書式文字列には12桁の精度を指定しますが、最初の書式文字列には12桁の精度を指定するため、末尾の0が返されます。

私は最も近い偶数にデフォルトのラウンドにより、しばらくMath.Round数値の書式は常に、離れゼロからを丸めることに注意します。

2

両者はまったく同じです。違いは、末尾のゼロの表示です。最初のコードスニペットでは、有効桁数は丸めにのみ使用され、文字列書式化ルーチンでは使用できないため、末尾のゼロを取得しなかったことは驚くことではありません。

+1

@DStanley:他の入力と一緒に表示されます。 *これらの入力*では、両方とも、両方の関数を使用して、まったく同じに丸められました。質問されている質問は、これらの入力に関する動作であり、後続のゼロまたはその不足である。 –

+0

OKあなたが何を意味しているのか分かります。私のコメントを削除しました。 –

関連する問題