2017-11-17 3 views
1

은 사진을 참조하십시오C에서 플로트 오류가 다른 이유는 무엇입니까?

enter image description hereenter image description here

내가 놀라운있어 결과가 다릅니다.

+0

수레에는 약 7 자리의 소수 자릿수가 있습니다. 두 개의 실수를 나눔으로써'price2'를 계산하고 있습니다. (결과로 계산 한 결과가 어떻게 계산되는지는 바뀌지 않습니다. 'CGFloat'에 저장하면 그 정확도가 유지되지 않습니다.) –

+7

순수 텍스트를 표시하는 것이 너무 어렵습니까? 그림 대신 텍스트로? – Gerhardh

+3

텍스트 이미지 [매우 도움이되지 않습니다] (// meta.unix.stackexchange.com/q/4086). 큰 소리로 읽거나 편집기로 복사 할 수 없으며 색인이 잘되지 않으므로 같은 문제가있는 다른 사용자가 여기에서 답을 찾지 못할 가능성이 적습니다. 관련 텍스트를 직접 통합하려면 게시물을 편집하십시오 (가능한 경우 복사 + 붙여 넣기를 사용하여 텍스트 오류를 ​​피하십시오). –

답변

6

CGFloat은 실제로는 64 비트 플랫폼에서 double입니다. (그것은 오래된 32 비트 플랫폼에 float이었다.)

그래서 여기가 분할하고 doubledouble 바이 : 여기

CGFloat price = 88888736 / a; 
     ^^^^^   ^^^^^^^^   ^
     double  int -> double  double 

그리고 당신은 doublefloat a로 나눈 것 :

CGFloat price2 = 88888736 / 100.0f; 
     ^^^^^^  ^^^^^^^^   ^^^^^^ 
     double  int -> double  float 

100.0 또는 (CGFloat)100으로 변경하면 문제가 없습니다.

LIVE DEMO

+2

아마도 명백하지 않은 부분은 정수 리터럴과 'double'을 나누기 때문에 첫 번째 나누기가 'double'구분이고 두 번째가 정수 리터럴과 'float'리터럴을 나누기 때문에 'float' 나눗셈이라는 것입니다. – Sulthan

+0

@ 설탕 : 고마워요. 이제 더 자세한 설명을 추가했습니다. –

+0

지난 11 월 이후로 질문에 답변하지 않았습니다. 어떻게 된 거예요? 그것은 너무 느려 보인다. –

2

CGFloat가 컴퓨터에 double이다, 그러므로 당신이하고있는 것은 이것이다 :

double a = 100.00f 
double price = 88888736/a 

float a2 = 100.00f // `float` type enforced by the trailing `f` 
double price2 = 88888736/a2 

의 차이는 첫 번째 경우의 부문에서 동안 double 부문이 있다는 것이다 두 번째 경우는 디비전이고 결과는 이고double에 할당됩니다. float 부서의 정밀도가 떨어 지므로 지금보고있는 결과를 얻게됩니다.

관련 문제