以下是KN King现代编程方法练习的解决方案代码。
#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
问题:
为什么浮点数会出现额外的十进制值?是否为float设置了默认精度,如何更改它(仅限默认值 - 我知道我可以使用格式化字符串来控制printf
中的精度值)。我在windows7上使用gcc
(Mingw)。
答案 0 :(得分:1)
浮点格式仅记录 数学值。它们不记录扫描(或以其他方式获得)时该值的精确度。 (就此而言,整数格式也是如此。)
显示浮点值时,必须指定要显示的位数。 C标准为%f
说明符定义了六位数的默认值: 1
表示浮点数的 double 参数将转换为样式 [ - ] ddd.ddd 中的十进制表示法,其中小数点后的位数 - 点字符等于精度规格。如果缺少精度,则取6;如果精度为零且未指定#标志,则不会出现小数点字符。如果出现小数点字符,则在其前面至少出现一个数字。该值四舍五入到适当的位数。
您可以通过在格式规范中写出句点之后的位数来指定精度,例如%.2f
: 2
精度采用句点形式(。),后跟星号 * (稍后描述)或可选的十进制整数;如果只指定了句点,则精度为零。
(星号用于指定传递给int
的{{1}}参数中的位数。)
注释
1 C 2011(N1570)7.21.6.1 8。
2 C 2011(N1570)7.21.6.1 4。
答案 1 :(得分:0)
你不能改变浮点数的精度,但是(听起来你知道)你可以改变浮点数显示的精度。
答案 2 :(得分:0)
为什么浮点数会出现额外的十进制值?
这就是为什么浮点数是浮点数。默认情况下,%f允许您在小数点后显示6位数。 这与存储的数字的精度无关。在大多数系统中,根据IEEE 754 FLOATING POINT表示存储数字。数字不存储小数点。因此,由于您无法控制存储数字的方式,因此无法更改精度。精确度已得到修复。
是否为float设置了默认精度,如何更改它。
同样,精确度不是默认值而不是它的存储方式。检查其表示为32位或64位。您希望在十进制后打印更多/更少的数字。您可以这样做:
float i=2.89674534423;
printf("%.10f",i); Prints 10 digits after decimal.
答案 3 :(得分:0)
双精度并非无限精确,并且它不会以十进制数存储数字,因此无法精确存储0.085。如果要将数字打印到两个有效数字,请使用精度格式说明符 - 有关示例,请参阅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”