어쩌면 내가 뭔가를 놓치고 있지만 그 float.ToString()
방법은 숫자를 반올림하여 많은 두통을 유발합니다.
다음 작은 코드를 살펴보십시오. 12345678을 입력으로 입력하면 디버거의 부동 소수점 숫자가 정확하지만 ToString
메서드 의 출력 은 12345680입니다 (내가 시도한 모든 형식).
Console.WriteLine("Please enter a float number");
float theFloat = float.Parse(Console.ReadLine());
Console.WriteLine(string.Format("You have entered {0}", theFloat.ToString("F")));
그리고 출력 :
Please enter a float number
12345678
You have entered 12345680.00
도움을 주시면 감사하겠습니다!
12345678
8 자리 숫자는 정밀도를 초과하므로 기본적 으로 유효 숫자 7 개로 반올림되어 12345680
. ( 기본적으로 참고하십시오 .)
그러나 Microsoft 기사에서 float의 정밀도에 대해 언급 한 내용에도 불구하고 실제로는 최대 9 자리의 정밀도를 보유합니다.
에 대한 Microsoft 문서Single.ToString()
상태 :
기본적으로 최대 9 자리가 내부적으로 유지되지만 반환 값에는 7 자리의 정밀도 만 포함됩니다.
그런 다음 다음과 같이 말합니다.
더 많은 정밀도가 필요한 경우 항상 9 자리의 정밀도를 리턴하는 "G9"형식 스펙으로 형식을 지정하거나 숫자를 해당 정밀도로 표시 할 수있는 경우 7 자리를 리턴하고 숫자가 가능한 경우 9 자리를 리턴하는 "R"을 지정하십시오. 최대 정밀도로 표현됩니다.
이 정보로 무장하면 다음 코드를 작성할 수 있습니다.
Console.WriteLine(12345678f.ToString("G9"));
실제로 인쇄 12345678
합니다.
내가 설명 할 수없는 것은 마이크로 소프트가 왜 float가 7 자리의 정밀도를 가지고 있다고 말한 다음 우리가 9 자리를 사용하도록하는 이유입니다.
그러나 다음 코드에서 알 수 있듯이 (마지막 숫자가 다름) 모든 8 (또는 9) 십진수 정수가 실수로 정확하게 표현되는 것은 아닙니다.
Console.WriteLine(16777217f.ToString("R")); // Prints 16777216
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다