문제

나는 산술 문제에 이어이 문제를 발견했다.

그러나 결과는 정상적인 수학 운영과 다릅니다. 왜 그렇습니까?

double d1 = 1.000001;

double d2 = 0.000001;

Console.WriteLine((d1-d2)==1.0);
도움이 되었습니까?

해결책

Jon Skeet의 Brainteasers 페이지에서 질문을 찾았다 고 생각하십니까? 답은 나열되고 설명됩니다 여기 같은 웹 사이트에서.

참조 문제를 위해 다음은 해당 페이지에서 복사 한 답변입니다.


3) 바보 같은 산술

컴퓨터는 산술에 능숙해야합니까? 이 인쇄는 왜 "false"입니까?

double d1 = 1.000001; double d2 =
0.000001; Console.WriteLine((d1-d2)==1.0);

답변 : 여기의 모든 값은 이진 부동 소수점으로 저장됩니다. 1.0은 정확하게 저장할 수 있지만 실제로 1.000001은 실제로 1.00009999999999999999999999999999946875로 저장됩니다. 그들 사이의 차이는 정확히 1.0이 아니며 실제로 차이는 정확히 저장 될 수 없습니다.


다른 팁

MSDN 항목에서 double.equals:

비교의 정밀도

두 값의 정밀도로 인해 두 개의 명백한 동등한 값이 불평등 할 수 있기 때문에 평등 방법은주의해서 사용해야합니다. 다음 예제는 이중 값 .3333과 1을 3으로 나누어 반환 된 이중 값이 불평등하다고보고합니다.

...

평등을 비교하는 대신, 권장되는 하나의 권장 기술은 두 값 (예 : 값 중 하나의 .01%) 사이의 수용 가능한 차이 마진을 정의하는 것이 포함됩니다. 두 값 사이의 차이의 절대 값이 그 여백보다 작거나 같으면 차이는 정밀도의 차이로 인한 것일 수 있으므로 값이 동일 할 수 있습니다. 다음 예제는이 기술을 사용하여 .33333과 1/3을 비교합니다. 이전 코드 예제가 불평등 한 두 가지 이중 값입니다.

"평등"비교를 많이 해야하는 경우 .NET 3.5에서 약간의 도우미 기능 또는 확장 방법을 작성하는 것이 좋습니다.

public static bool AlmostEquals(this double double1, double double2, double precision)
{
    return (Math.Abs(double1 - double2) <= precision);
}

이것은 다음과 같은 방법으로 사용될 수 있습니다.

double d1 = 1.000001;

double d2 = 0.000001;

bool equals = (d1 - d2).AlmostEquals(1.0, 0.0000001);

이 매우 유사한 질문을 참조하십시오. C#.NET : 평등의 부동 소수점 값을 0으로 확인하는 것이 안전합니까?

컴퓨터가 기본 2에서 수학을 수행하기 때문에 많은 소수점 부동 소수점 번호는 제한된 수의 숫자로 정확하게 표시 될 수 없습니다.

부동 소수점 번호를 사용하고 있기 때문입니다.

http://docs.sun.com/source/806-3568/ncg_goldberg.html

응용 프로그램에서 그러한 산술을하는 경우 decimal 유형을 사용해야합니다

decimal d1 = 1.000001M;

decimal d2 = 0.000001M;

Console.WriteLine((d1 - d2) == 1.0M); // evaluates as true

결과가 정확히 1.0이 아니라 1.000000000001과 같은 플로팅 포인트 정밀 문제로 인한 것일 수 있습니다.

플로팅 포인트는베이스 10 표현이 아닌베이스 2를 사용하는 숫자를 저장하기 때문에 발생합니다. 이는 Double이 0.1과 같은 값을 정확하게 저장할 수 없다는 결과를 가져옵니다. 예를 들어 0.1은 단일 값 0.100000001490116119384765625로 표시됩니다.

오류를 제거하려면 10 진수를 사용해야합니다.

이는 CPU에서 부동 소수점 번호가 작동하는 방식 때문입니다. C# 별이 아닙니다. 보다 이것 Wikipedia 입국 및 종이 여기 더 많은 정보를 위해서.

짧은 대답은 플로팅 포인트 번호가 정확한 표현으로 저장되지 않으므로 "=="을 사용하여 비교하는 것은 사용하는 방식에서 작동하지 않습니다.

Python Docs가 무엇을 말해야하는지 확인하십시오. 문제는 다음과 같습니다.

http://docs.python.org/tutorial/floatingpoint.html

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