문제
코드가 있는데 이해가 안 돼요.저는 정밀도가 매우 중요한 애플리케이션을 개발 중입니다.하지만 .NET에서는 중요하지 않습니다. 왜 그렇습니까?모르겠습니다.
double value = 3.5;
MessageBox.Show((value + 1 * Math.Pow(10, -20)).ToString());
그러나 메시지 상자에는 다음이 표시됩니다.3.5 제발 도와주세요. 감사합니다.
해결책
당신은 정밀도를 가질 수 있지만, 당신이하고 싶은 것이 무엇인지에 따라 다릅니다. 다음을 콘솔 애플리케이션에 넣는 경우 :
double a = 1e-20;
Console.WriteLine(" a = {0}", a);
Console.WriteLine("1+a = {0}", 1+a);
decimal b = 1e-20M;
Console.WriteLine(" b = {0}", b);
Console.WriteLine("1+b = {0}", 1+b);
당신은 얻을 것입니다
a = 1E-20
1+a = 1
b = 0,00000000000000000001
1+b = 1,00000000000000000001
그러나 그 점에 유의하십시오 Pow
수학 클래스의 거의 모든 것과 마찬가지로 기능은 두 배로 만집니다.
double Pow(double x, double y);
따라서 소수점의 사인을 취할 수는 없습니다 (다른 사람은 두 배로 변환하여)
또한 참조하십시오 이 질문.
다른 팁
정밀도가 매우 중요한 일을하고 있다면 부동 소수점의 한계를 알고 있어야합니다. 좋은 참조는입니다 David Goldberg의 "모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 것".
떠 다니는 점은 충분한 정밀도를 제공하지 않으며 소수점으로 작업해야한다는 것을 알 수 있습니다. 그러나 이것들은 항상 부동 소수점보다 훨씬 느립니다. 정확도와 속도 사이의 상충입니다.
a의 정밀도 Double
15자리(내부적으로는 17자리)입니다.계산하는 값 Math.Pow
맞습니다. 하지만 추가하면 value
차이를 만들기에는 너무 작습니다.
편집하다:
Decimal은 해당 정밀도를 처리할 수 있지만 계산은 처리할 수 없습니다.이러한 정밀도를 원하면 계산을 수행한 다음 각 값을 Decimal
함께 추가하기 전에:
double value = 3.5;
double small = Math.Pow(10, -20);
Decimal result = (Decimal)value + (Decimal)small;
MessageBox.Show(result.ToString());
또는 사용하십시오 소수 두 배보다는 타입.
이중 정밀도는 15-16 자리를 유지할 수 있음을 의미합니다. 3.5 + 1e-20 = 21 자리. 이중 사전으로 표현할 수 없습니다. 소수점과 같은 다른 유형을 사용할 수 있습니다.