2013-02-13 2 views
3

현재 복잡한 계산에서 높은 정밀도를 가진 숫자로 작업하고 있습니다. 일부 결과 및 소스 데이터는 직렬화 된 형식으로 저장해야합니다. 모든 것이 좋은 때까지 마술 double 값 : 0.00000060912702792848.C# 매직 이중 값 구문 분석

s = d.ToString("R", NumberFormatInfo.InvariantInfo); 

이 예상 부여합니다 결과 6.0912702792848E-07 : 문자열로 그 값을 (XmlWriter를이 무엇을하는 것이) 작성

.

그러나 마법의 시작은 내가 다시 (길을 어떻게 XmlReader를 작품) double 값을 얻을 때 :

d=double.Parse(s, NumberStyles.Float, NumberFormatInfo.InvariantInfo); 

다시 변환 값이 마지막에 005 여분의 자리 0.00000060912702792848005입니다.

이러한 결과를 제공하는 숫자의 특수 조합처럼 보입니다. 무엇이 놓칠까요?

환경 : Windows 7 Professional, 64-bit. 당신이 마지막에 추가 소수 없애하려는 경우 귀하의 질문에 정확히 대답은, 당신은

+0

부동 소수점 숫자가 정확하지 않다는 것을 알고 있다고 생각하십니까? –

+0

네, 저도 압니다. 그리고 복식으로 수학 연산에 편차가 있는지 궁금하지 않습니다. 그러나 나는 문자열에서 double을 변환 한 후 다른 숫자를 얻는 이유와 그 여분의 숫자가 오는 곳에서 다른 숫자를 얻는 것이 왜 놀랍다. – Gennadiy

답변

0

를 사용할 수 있지만 :

s = d.ToString("G20", NumberFormatInfo.InvariantInfo); 
+1

나는 그것을 해킹하는 방법을 안다. 제 질문은 그 숫자에 정확히 나오는 이유입니다. 그리고 변환 후의 마술 자리가 어디서 왔는지. – Gennadiy

0

왕복 (R) 형식 지정자에 대한 MSDN 문서에 포함 된 64 또는/플랫폼 : anycpu를 스위치와 실행을 다음 주 : /플랫폼을 사용하여 컴파일하면 어떤 경우에는

의 "R"표준 숫자 형식 문자열로 포맷을 두 번 값은 왕복 성공적으로하지 않습니다 64 비트 시스템에서. 이 문제를 해결하려면 "G17"표준 숫자 형식 문자열을 사용하여 Double 값의 서식을 지정할 수 있습니다. 다음 예제에서는 왕복 이동에 성공하지 않은 Double 값을 가진 "R"형식 문자열을 사용하고 "G17"형식 문자열을 사용하여 원래 값을 왕복 이동합니다. (Standard Numeric Format Strings)

싶게 프로젝트 설정에서 prefer 32 bit 플래그를 사용하지 anycpu를에 플랫폼을 설정할 때 나는 당신의 문제를 재현 할 수있다. prefer 32 bit 플래그를 활성화하면 구문 분석 된 이중은 원래의 일련화된 값과 일치합니다. 설명서에 설명 된대로 G17 형식 문자열을 사용하여 예상 값을받을 수 있습니다.