문제

C#에서. 20 자리 정밀도가있는 더블 (데이터베이스에서 추출한)이 있습니다. Visual Studio (QuickWatch 사용)에서는 두 배의 값이 = 0.00034101243963859839로 볼 수 있습니다.

이 값을 텍스트 상자에 표시 한 다음 가져 와서 다시 두 배로 변환 할 때 동일한 값이됩니다. 그러나 나는 항상 마지막 두 자리를 잃습니다

다음을 시도했습니다.

double d = 0.00034101243963859839;
string s = d.ToString();
string s2 = d.ToString("F20");
string s3 = d.ToString("0.00000000000000000000"); -- 20 0's
string s4 = (d*100d).ToString();

이 경우 :

s  = 0.000341012439638598
s2 = 0.00034101243963859800
s3 = 0.00034101243963859800
s4 = 0.0341012439638598

다음을 수행하고 싶습니다.

double d = 0.00034101243963859839;
string s = d.ToString();
//...
double d2 = double.Parse(s);
if(d == d2)
{
  //-- Success
}

마지막 두 숫자의 정밀도를 유지하는 방법이 있습니까 ??

도움이 되었습니까?

해결책

"R"를 사용하십시오. 숫자 형식 문자열:

double d = 0.00034101243963859839;
string s = d.ToString("R");
//...
double d2 = double.Parse(s);
if(d == d2)
{
  //-- Success
}

그만큼 R "왕복"을 나타냅니다. 링크 된 문서에서 :

이 형식은 단일 및 이중 유형에 대해서만 지원됩니다. 왕복 지정자는 문자열로 변환 된 숫자 값이 동일한 숫자 값으로 다시 구문 분석되도록 보장합니다.

제쳐두고, 나는 마지막 두 자리를 유지할 방법이 없다고 생각합니다. 가능한 정밀도가 너무 많아서 그들이 그것을 만든 적이 없다. d 처음에. 그러나 당신은 당신의 문자열이 최소한 당신이 가지고있는 것을 올바르게 다시 읽을 수 있는지 확인할 수 있습니다.

추가 정밀도가 필요한 경우 decimal 대신에.

다른 팁

아닙니다. 이중은 이진이므로 소수점 값에 좋지 않다는 사실 외에도 복식의 최대 15/16 자리수 (53 비트)가 있습니다. 10 진수는 최대 28/29 자리 (96 비트)를 가지므로 사용해도 괜찮습니다. 데이터베이스에 정밀도가 높은 경우 C#에 대한 자체 Bignum 클래스가 필요합니다. 구현을 위해 StackoverFlow를 확인하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top