2013-11-24 3 views
0

아래는 KN King의 Modern Programming 접근법에 대한 솔루션 코드입니다.float 값에 대한 추가 정밀도 값

#include<stdio.h> 

int main(void) 
{ 
    int i; 
    float j,x; 
    scanf("%f%d%f",&x,&i,&j); 
    printf("i = %d",i); 
    printf("x = %f",x); 
    printf("j = %f",j); 
} 

입력 :

12.3 45.6 789 

예상 결과 :

i = 45 
x = 12.3 
j = 0.6 

실제 결과 :

i = 45 
x = 12.300000 
j = 0.600000 
,451,515,

질문 :

왜 수레를 위해 볼 여분 진수 값이있다? float에 설정된 기본 정밀도가 있으며 변경할 수 있습니까 (기본값 만 - 형식 문자열을 사용하여 printf의 정밀도 값을 제어 할 수 있음). Windows7에서 gcc (Mingw)을 사용하고 있습니다.

+2

은 "왜이 수레를 위해 볼 여분 진수 값입니다?"인쇄합니다 왜냐하면 이것이'% f '지정자가 작동하는 방식이기 때문입니다. '% g'을 대신 사용해보십시오. –

+0

@ H2CO3,'printf'에서'% g'을 사용하면 올바르게 표시됩니다. 그렇다면 float에 설정된 기본 정밀도를 볼 수 있습니까? 모든 플랫폼에서 동일합니까? – sarbjit

답변

1

부동 소수점 형식은 만 숫자로을 기록합니다. 스캔 (또는 다른 방식으로 획득) 할 때 값의 정밀도를 기록하지 않습니다. (정수 형식에 대해서도 마찬가지입니다.)

부동 소수점 값을 표시 할 때 표시 할 자릿수를 지정해야합니다. C 표준은 %f 지정을위한 여섯 자리의 기본 정의 : 1

부동 소수점 수를 나타내는 인수 스타일 진수 표기로 변환됩니다 더블 [-]을 ddd.ddd 여기서 소수점 이하 자릿수는 정밀도 스펙과 같습니다. 정밀도가 누락 된 경우 6으로 간주됩니다. 정밀도가 0이고 # 플래그가 지정되지 않으면 소수점 문자가 표시되지 않습니다. 소수점 문자가 나타나면 앞에 소수 자릿수가 하나 이상 나타납니다. 값은 적절한 자릿수로 반올림됩니다. 2

정밀도는 시대의 양식을 취합니다

당신은 %.2f 같은 형식 사양 기간 자릿수를 작성하여 정밀도를 지정 (.) 뒤에 별표 * (선택 사항) 또는 선택적 10 진 정수로 표시됩니다. 마침표 만 지정하면 정밀도는 0으로 간주됩니다.

(별표는 printf에 전달 된 매개 변수의 자릿수를 지정하는 데 사용됩니다.)


노트

1 C 2011 (N1570) 7.21.6.1 제

2 C 2011 (N1570) 7.21.6.1 4.

+0

'% g'은 스캔 된 값을 표시합니까? http://linux.die.net/man/3/printf에 따르면, '% g'에 대해서도 정밀도가 누락 된 경우 6 정밀도가 사용되지만 대소 문자처럼 보이지는 않습니다. – sarbjit

+0

@arbjit : '% g'지정자는 크기 (및 지정된 정밀도)에 따라 숫자를 표시하기 위해 고정 표식이나 과학 표기법을 사용한다고 말합니다. 정밀도에 대해 지정된 자릿수는 변경되지 않습니다. –

0

float의 정밀도는 변경할 수 없지만 (알고있는 것처럼 들리지만) float 표시의 정밀도를 변경할 수 있습니다.

0

왜 거기 수레에 대해 보이는 여분의 십진수 값?

그래서 float가 floats입니다. 기본적으로 % f를 사용하면 10 진수로 6 자리를 표시 할 수 있습니다. 그것은 저장된 숫자의 정밀도와 아무 관계가 없습니다. 숫자는 대부분의 시스템에서 IEEE 754 부동 소수점 표현에 따라 저장됩니다. 숫자는 소수점과 함께 저장되지 않습니다. 따라서 숫자 저장 방법을 제어하지 않기 때문에 정밀도를 변경할 수 없습니다. 정밀도가 고정되어 있습니다.

float에 대한 기본 정밀도가 설정되어 있으며이를 어떻게 변경할 수 있습니까?

다시 정밀도는 저장 방법이 아닌 기본값이 아닙니다. 그래서, 이중 무한히 정확하지

float i=2.89674534423; 
printf("%.10f",i); Prints 10 digits after decimal. 
0

, 그것은 소수에 번호를 저장하지 않습니다 32 비트에 대한 자사의 표현을 확인하거나 64 decimal.You이 작업을 수행 할 수있는 후보다/더 적은 숫자를 인쇄하고자 bit.Youwould 0.085를 정확하게 저장할 수 없습니다. 숫자를 2 자리 숫자로 인쇄하려면 정밀 형식 지정자를 사용하십시오 (예 : http://www.cprogramming.com/tutorial/printf-format-strings.html 참조).

double value = 0.085; 
NSLog(@"%.2g", value); 

이 "0.085"이

는 정밀 지정자를 사용하는 것이 일반적 소수점 표시 숫자의 수를 제어주의하십시오 인쇄합니다 -하지만 이중의 경우는 유효 숫자를 제어합니다.

float value = 0.085; 
NSLog(@"%.2f", value); 

은 "0.09는"

관련 문제