2012-08-25 3 views
1
**NSLog(@"%0.2f", 1.345); // output 1.34** 
NSLog(@"%0.2f", 1.3451);// output 1.35 
NSLog(@"%0.2f", round(1.345 * 100)/100.);//output 1.35 

첫 줄 출력이 1.34 인 이유 !! !!왜 출력됩니까? NSLog (@ "% 0.2f", 1.345); // 출력 1.34

=======================================

업데이트 :

NSLog(@"%.2f", round([@"644.435" doubleValue] * 100)/100); // output 644.43, 

하지만

NSLog(@"%.2f", round([@"6.435" doubleValue] * 100)/100); // output 6.44? 

나는이 시점 이후 두 자리를 유지하는있는 NSString을 변환 할 경우, 당신은 어떻게 변환 조언을 주시겠습니까?

답변

4

IEEE754에서 1.345를 정확하게 표현할 수 없기 때문에. 아마도 1.34444444449와 같은 것이고 인쇄 될 때 1.34를줍니다. 당신은 IEEE754, 정밀도 및 부동 소수점, 같은 물건을 검색하면

억 개 정도의 기사 중 하나가 당신을 계몽 할 수 있어야합니다 :-)

봐 특히위한 : What every computer scientist should know about floating point. 좀 더 구체적으로 간다

다음 C 프로그램을 검사 :

#include <stdio.h> 
int main (void) { 
    float f = 1.345f; 
    double d = 1.345; 
    printf ("f = %.20f\nd = %.20lf\n", f, d); 
    return 0; 
} 

이것의 출력은 다음

f = 1.34500002861022949219 
d = 1.34499999999999997335 

그래서 float 값이 거의 1.345과 double (위에 당신이 f 접미사없이 1.345을 지정할 때 얻을 수있는 것입니다.) 약간 아래에 있습니다.

그 이유는 1.35으로 반올림되지 않고 1.34으로 잘린 이유를 설명합니다.

+0

은 [A 계산기 (http://babbage.cs.qc.cuny.edu/IEEE-754/)는'1.3450000286102294921875' – dasblinkenlight

+2

@dasblinkenlight 같은 수를 나타내고, 즉 '1.345f 할 것'float' 대해 야 '. 두 배인'1.345'가 약간 아래에 있습니다 - 업데이트를보십시오. – paxdiablo

+0

+1 당신 말이 맞아요, 좋은 찾으세요! – dasblinkenlight