C# 20 자리 정밀도를 문자열로 변환하고 다시 뒤로 변환합니다.
문제
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를 확인하십시오.