2009-10-20 1 views
3
x = 4.2 - 0.1 

vb.net는 4.1000000000000005
파이썬은 4.1000000000000005VB.Net과 Python에서 예상치 못한 (부정확 한) 결과를 반환하는 부동 소수점 연산에서 간단한 수학 연산을 수행하는 이유는 무엇입니까?

Excel에서 4.1
Google calc

이런 일이 발생하는 이유는 무엇입니까 4.1을 제공 제공 제공 제공?

+2

Google calc explicity는 입력을 실수로 캐스팅 한 다음 정확도 문제를 잘라냅니다. http://en.wikipedia.org/wiki/Floating_point#Minimizing_the_effect_of_accuracy_problems를 참조하십시오. –

+7

3 번 또는 4 번 읽으십시오. http://docs.sun.com/source/806-3568/ncg_goldberg.html – nlucaroni

+3

중복. http://stackoverflow.com/questions/1089018/why-cant-decimal-numbers-be-represented-exactly-in-binary, http://stackoverflow.com/questions/177506/why-do-i-see- a-double-variable-initial-to-some-value-like-21-4-as-21-39999961, http://stackoverflow.com/questions/963873/1-265-10000-126499-99999999999 등 –

답변

13

Float/double precision.

해당 이진, 4.1 = 4 + 1/10을 기억해야합니다. 1/10은 이진수로 무한히 반복되는 합계입니다. 1/9가 십진수로 무한대로 합쳐진 것과 같습니다.

+0

0.000110011001100 ... 이진수는 십진수 0.1입니다. 해결 방법은 http://www.exploringbinary.com/binary-converter/ –

4

정말 문제 없습니다. 수레가 작동하는 방식입니다 (내부 바이너리 표현). 어쨌든 :

>>> from decimal import Decimal 
>>> Decimal('4.2')-Decimal('0.1') 
Decimal('4.1') 
+0

+1입니다. –

1

vb.net에서 대신 진수 형식을 사용하여이 문제를 방지 할 수 있습니다 :

Dim x As Decimal = 4.2D - 0.1D 

결과는 4.1입니다.

10
>>> x = 4.2 - 0.1 
>>> x 
4.1000000000000005 

>>>>print(x) 
4.1 

이것은 how numbers are stored internally 때문에 발생합니다.

컴퓨터는 우리가 익숙했던 것처럼 10 진수가 아닌 2 진수로 나타냅니다. 부동 소수점 수를 사용하면 컴퓨터는 근사값을 가장 가까운 이진 부동 소수점 값으로으로 설정해야합니다.

Almost all machines today (2000 년 11 월) IEEE-754 부동 소수점 연산을 사용하며 거의 모든 플랫폼은 Python 부동 소수점을 IEEE-754 "배정도"에 매핑합니다. 754 개의 double에는 53 비트의 정밀도가 포함되어 있으므로 입력시 컴퓨터는 0.1을 가장 가까운 비율로 변환하려고 시도합니다. J/2***N*J은 정확히 53 비트를 포함하는 정수입니다.

당신 print 만약 정상 값으로 잘립니다 수, it will show the approximation. 예를 들어, 실제 값이 0.1 인 경우 0.1000000000000000055511151231257827021181583404541015625입니다. 당신이 정말는베이스 (10)를 기반으로 번호가 필요하면

(이 질문에 대한 답을 모르는 경우, 당신은은하지 않습니다), 당신은 decimal.Decimal (파이썬에서) 사용할 수 있습니다

>>> from decimal import Decimal 
>>> Decimal("4.2") - Decimal("0.1") 
Decimal("4.1") 

이진 부동 소수점 연산은 이와 같은 많은 놀라움을 가지고 있습니다. "0.1"문제는 아래의 "Representation Error"섹션에서 자세히 설명합니다. 다른 일반적인 놀라움에 대한 자세한 내용은 The Perils of Floating Point을 참조하십시오.

끝 부분에 "쉬운 대답이 없습니다."라고 말하면서도 부동 소수점에 과도하게주의하지 마십시오!Python 부동 소수점 연산의 오류는 부동 소수점 하드웨어에서 상속되며 대부분의 시스템에서는 연산 당 2**53에 1을 넘지 않습니다. 대부분의 작업에 이상적이지만 십진수 연산이 아니며 모든 부동 소수점 연산에 새로운 반올림 오류가 발생할 수 있다는 점을 명심해야합니다.

병리학 적 케이스가 존재하지만, 대부분의 일상적인 부동 소수점 연산의 경우 최종 결과의 디스플레이를 원하는 소수 자리로 반올림하면 결국 예상되는 결과를 볼 수 있습니다. 일반적으로 str()이면 충분하며, 더 세밀하게 제어하려면 메서드의 형식 지정자 인 Format String Syntax을 참조하십시오.

+1

실제 값 1.1은 0.1000000000000000055511151231257827021181583404541015625입니다. => 끄기 1.0 – foosion

+0

@ 소개 : 좋은 잡기. – voyager

관련 문제