C#에서 출력을 위한 Double 형식 지정
최근 실험에서는 C#에서 C의 출력 형식 지정 기능을 에뮬레이션하려는 시도가 있었습니다. 그러나 예상 출력과 실제 출력 간에 불일치가 관찰되었습니다.
C 코드:
double i = 10 * 0.69; printf("%f\n", i); printf(" %.20f\n", i); printf("+ %.20f\n", 6.9 - i); printf("= %.20f\n", 6.9);
다음과 같은 출력이 생성되었습니다.
6.900000 6.89999999999999946709 + 0.00000000000000088818 = 6.90000000000000035527
C# code:
double i = 10 * 0.69; Console.WriteLine(i); Console.WriteLine(String.Format(" {0:F20}", i)); Console.WriteLine(String.Format("+ {0:F20}", 6.9 - i)); Console.WriteLine(String.Format("= {0:F20}", 6.9));
yielded:
6.9 6.90000000000000000000 + 0.00000000000000088818 = 6.90000000000000000000
디버거에서 i가 6.89999999999999946709로 표시되었음에도 불구하고 C# 형식 지정에서는 형식을 적용하기 전에 값을 유효 십진수 15자리로 반올림합니다.
이 예상치 못한 동작은 .NET 때문입니다. 내부적으로 이진 표현을 사용하여 double을 저장합니다. 서식을 지정하기 전에 .NET은 double을 십진수 문자열로 변환하므로 본질적으로 반올림 오류가 발생합니다.
이 문제를 방지하려면 다음 중 하나를 수행하세요.
DoubleConverter 사용 예:
Console.WriteLine(DoubleConverter.ToExactString(i)); Console.WriteLine(DoubleConverter.ToExactString(6.9 - i)); Console.WriteLine(DoubleConverter.ToExactString(6.9)); // 6.89999999999999946709294817992486059665679931640625 // 0.00000000000000088817841970012523233890533447265625 // 6.9000000000000003552713678800500929355621337890625
위 내용은 Double 형식을 지정할 때 C#과 C가 서로 다른 출력을 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!