왕복(R) 형식 지정자란?
C#의 왕복(round-trip) 형식 지정자 "R"은 Single, Double, BigInteger 형식에서 지원됩니다.
이 지정자를 사용하면 숫자 값을 문자열로 변환한 뒤 다시 파싱(parse)했을 때, 반드시 원래의 숫자 값과 동일한 값으로 복원됩니다.
즉, 부동 소수점 수처럼 변환 과정에서 정밀도가 손실되기 쉬운 값이라도 문자열로 직렬화한 후 역직렬화하면 값이 그대로 유지되므로, 데이터 저장이나 전송 시 매우 유용합니다.
사용 방법
먼저 double 변수를 하나 선언합니다.
double doubleVal = 0.91234582637;
그다음 ToString() 메서드를 호출하면서 왕복 형식 지정자 "R"을 인수로 전달합니다. 이때 문화권(culture)에 따라 결과가 달라지는 것을 방지하기 위해 CultureInfo.InvariantCulture를 함께 지정하는 것이 좋습니다.
doubleVal.ToString("R", CultureInfo.InvariantCulture);
예제
다음은 왕복 형식 지정자를 실제로 적용해 본 완전한 예제입니다.
using System;
using System.Numerics;
using System.Globalization;
class Demo {
static void Main() {
double doubleVal = 0.91234582637;
string str = doubleVal.ToString("R", CultureInfo.InvariantCulture);
double resRound = double.Parse(str, CultureInfo.InvariantCulture);
// 'R'로 Double 값 왕복 테스트
Console.WriteLine(doubleVal.Equals(resRound));
}
}
출력 결과
True
코드 설명
1. doubleVal.ToString("R", CultureInfo.InvariantCulture) – double 값을 왕복 형식으로 문자열로 변환합니다.
2. double.Parse(str, CultureInfo.InvariantCulture) – 변환된 문자열을 다시 double 값으로 파싱합니다.
3. doubleVal.Equals(resRound) – 원래 값과 복원된 값을 비교합니다. 결과가 True라면 값이 완벽하게 복원된 것입니다.
참고 사항
.NET Core 2.0부터는 "R" 형식 지정자가 완벽한 왕복에 실패하는 경우, Double 값에는 자동으로 "G17" 형식이, Single 값에는 "G9" 형식이 대신 사용됩니다.
따라서 최신 .NET 환경에서는 "R"보다 "G17" 또는 "G9" 같은 일반 목적(general-purpose) 형식 지정자를 사용하는 것도 좋은 대안이 될 수 있습니다.