2016-09-27 6 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); 
     } 
    } 
} 

: 123.456 출력의 입력에

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); 
     } 
    } 
} 

47882.2198038791

하고 일의 방법 47882.219803879100

자리 표시 자 반올림과 Math.Round 반올림 결과의 차이점은 무엇입니까?

+0

@CodeCaster :이 질문에서 논의 된 차이점은 여기서 관찰되지 않습니다. –

+2

{0}에서 가져 오는 기본 서식은 표시된 결과의 유효 자릿수가 15자를 초과하지 않도록합니다. 더 많은 것을 표시하는 것은 말도 안되기 때문에, * double * 타입은 그 많은 숫자를 저장할 수 없습니다. 53 비트를 사용하여 2^53 고유 값 만 표현할 수 있습니다. F12를 사용하면 난센스 규칙을 무시하고 17 자리를 얻습니다. 마지막 두 개는 무작위 소음이며, 0 점은 불행한 일입니다. 일어날 수있는 것은 사고입니다. –

답변

2

Math.Round 실제로 형식 번호를 사용하는 동안 은 반올림 값을 표시합니다. 두 x 째 형식. 자열에는 12 자리의 정밀도를 지정하지만 첫 x 째 형식. 자열은 지정하지 않으 G로 후미에 0을 제공합니다.

는 그 숫자 형식이 항상 기본 라운드로 Math.Round 동안 가까운 짝수에, 멀리 제로에서 라운드에 유의한다.

2

둘 다 똑같이 반올림 됨. 차이점은 후미 0 표시에 있습니다. 첫 번째 코드 단편에서 유효 자릿수는 반올림에만 사용되며 문자열 형식화 루틴에서는 사용할 수 없으므로 후행 0을 얻지 못한 것은 놀라운 일이 아닙니다.

+1

@DStanley : 다른 입력과 함께 표시됩니다. * 이러한 입력 *을 사용하면 두 함수 모두를 사용하여 똑같이 반올림 할 수 있습니다. 질문되는 질문은 이러한 입력에 대한 동작입니다.이 입력은 후미에있는 0 또는 해당 입력이 없습니다. –

+0

OK 당신이 의미하는 바를 봅니다. 내 의견을 삭제했습니다. –