문제

코드가 있는데 이해가 안 돼요.저는 정밀도가 매우 중요한 애플리케이션을 개발 중입니다.하지만 .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 자리. 이중 사전으로 표현할 수 없습니다. 소수점과 같은 다른 유형을 사용할 수 있습니다.

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