0

작은 문제가있어 해결책을 찾을 수 없습니다!Objective-C의 수레 문제

내 코드 (이것은 단지 샘플 코드,하지만 내 원래의 코드는 다음과 같은 일을 할)입니다 :

float x = [@"2.45" floatValue]; 


for(int i=0; i<100; i++) 
    x += 0.22; 

NSLog(@"%f", x); 

출력은 52.450001하지 52.450000입니다!

나는 이런 일이 있기 때문에 잘 모르겠습니다!

도움 주셔서 감사합니다.

~ ~ 모두에게

덕분에 해결! 네, 더블 타입으로 해결했습니다!

+1

hanno의 링크가이 문제를 설명합니다. 이 특별한 예제는 float 대신에 double을 사용하지 않았지만 동일한 기본 결함이 존재합니다. 하지만 – JimG

+0

다른 숫자는 두 배가됩니다. 십진법을 시도하십시오. –

답변

6

수레가 특정 정밀도로 숫자 표현입니다 참조하십시오. 모든 값이이 형식으로 표현 될 수있는 것은 아닙니다. here도 참조하십시오.

이유는 쉽게 생각할 수 있습니다. 인터벌 (1..1)에는 번호가 무제한이지만 float에는 모든 숫자를 나타내는 비트 수가 제한되어 있습니다 (-MAXFLOAT..MAXFLOAT).

32 비트 정수 표현에는 표현할 수있는 정수가 있습니다. 32 비트 또는 64 비트의 제한된 표현으로는 완전히 표현할 수없는 무수한 실제 값이 있습니다. 따라서 가장 높고 가장 낮은 대표 가치의 실제 값뿐만 아니라 정확도에도 한계가 있습니다.

왜 부동 소수점 뒤에 작은 숫자가있는 숫자가 영향을 받습니까? 표현은 소수 대신 이진 시스템을 기반으로하므로 다른 숫자를 쉽게 나타내면 십진수가 쉽게 나타납니다.

2

부동 소수점 숫자는 컴퓨터에서 항상 쉽게 표현할 수있는 것은 아닙니다. 이로 인해 일부 숫자가 부정확 해집니다.

1/3이 십진수로 무엇인지 묻고 싶습니다. 아무리 노력해도 십진수가 정확하게 그 숫자를 설명 할 수 없기 때문에 그것이 무엇인지 말해 줄 수 없을 것입니다.

소수는 소수점 이하를 정확하게 설명 할 수 없습니다.