>백엔드 개발 >C++ >Double 형식을 지정할 때 C#과 C가 서로 다른 출력을 생성하는 이유는 무엇입니까?

Double 형식을 지정할 때 C#과 C가 서로 다른 출력을 생성하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-04 19:27:44405검색

Why Do C# and C Produce Different Output When Formatting Doubles?

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을 십진수 문자열로 변환하므로 본질적으로 반올림 오류가 발생합니다.

이 문제를 방지하려면 다음 중 하나를 수행하세요.

  • 정확한 십진수에 액세스하세요. double 값: 내부 바이너리 비트를 추출하여 10진수 값의 문자열 표현을 구성합니다.
  • 사용자 정의 형식 지정 라이브러리 사용: double의 정확한 소수 값을 검색하고 출력을 지정된 정밀도로 반올림하는 방법을 제공하는 Jon Skeet의 DoubleConverter 클래스를 활용하세요.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.