2012-01-16 2 views
4

의 이중 손실을 문자열로 변환 :C#을 나는 다음과 같은 한 정밀

string value = "9223372036854775807"; 
double parsedVal = double.Parse(value, CultureInfo.InvariantCulture); 

... 그 결과는 똑같은 번호를하지 않은 9.2233720368547758E+18이다. 어떻게 정밀도를 잃지 않고 문자열을 double로 변환해야합니까?

+0

시도가'답이 – xbonez

+1

을 System.Convert.ToDouble' 참조하십시오. 복식은 무한 정밀도가 아닙니다. 두 배로 저장할 수있는 가장 큰 홀수는 16 자리입니다. 또는 아마도 더 현실적인, 이중 대신 ulong으로 변환하십시오. –

+2

@xbonez - havent '잠시 동안 cehcked하지만 꽤 똑같은 지름길이라고 확신합니다. –

답변

4

9223372036854775807을 double으로 변환 할 수 없으며 2 진 부동 소수점 연산에 대한 이중 ((IEEE 754) 표준의 정의로 인해 정밀도가 떨어지지 않습니다.

내부적으로 최대 17 자릿수가 유지되지만 기본적으로 Double 값에는 십진수 15 자리의 정밀도 이 포함됩니다.

8

double은 16 진수 (10 진수) 만 가능합니다. decimal (약간의 비트가 있고, 충분한 헤드 룸으로 그 값을 보유하고 있습니다)으로 전환 해보십시오.

+0

기본적으로 Double 값은 내부에서 최대 17 자리 숫자가 유지되지만 15 자릿수의 정밀도를 포함합니다. –

+0

@Mitch 궁극적으로 IEEE 754의 정의에 의해 제한됩니다.하지만 –

+0

하지만 왜? double에서 Double을 파싱 할 수있을 것으로 기대합니다 .MinValue에서 double로 변환 할 수 있습니다 .MaxValue. 9223372036854775807에 대한 가치가 있다면 왜 문자열에서 가져올 수 없습니까? 지수 표기법이 아니면 괜찮습니다. – user1001371

1

10 진수를 사용하면 여기에 필요한 정밀도를 얻을 수 있습니다. 그러나 Decimal은 같은 저장소 범위을 이중으로 사용하지 않습니다. 짧은 문자열을 사용하십시오

Can C# store more precise data than doubles?

+0

Re "storage capacity"-'decimal'는 실제로 'double'보다 * * 더 많습니다. 표현은 다르지만 96 비트 숫자입니다 –

+0

고마워요. 도움이된다. – user1001371