浮点值的额外精度值

时间:2013-11-24 12:23:23

标签: c gcc

以下是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)。

4 个答案:

答案 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”