c ++值和变量之间的不同打印行为

时间:2016-07-29 13:58:20

标签: c++ c printf

我在mac上尝试了以下代码,输出对我来说有点奇怪。

float a = 2.225;
float b = 123.235;
printf("round: %.2f %.2f \n", a, b);
printf("round: %.2f %.2f \n", 2.225, 123.235);

输出:

round: 2.22 123.24 
round: 2.23 123.23 

g ++ --version

Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.3.0 (clang-703.0.31)
Target: x86_64-apple-darwin15.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

印刷中的舍入规则是什么?如何在这两种情况下获得相同的打印效果? 非常感谢。

2 个答案:

答案 0 :(得分:6)

第一个printf()float值转换为double,然后打印结果。请注意,初始化会将double常量转换为float。第二个直接传递double值。您可以使用后缀float指定F常量 - 但由于默认参数,在实际调用float之前,C的规则仍将double常量转换为printf()促销规则。

#include <stdio.h>

int main(void)
{
    float a = 2.225;
    float b = 123.235;
    printf("round: %.2f %.2f\n", a, b);
    printf("round: %.2f %.2f\n", 2.225, 123.235);
    printf("round: %.2f %.2f\n", 2.225F, 123.235F);

    return 0;
}

输出:

round: 2.22 123.24 
round: 2.23 123.23 
round: 2.22 123.24 

答案 1 :(得分:4)

2.225

这是一个double类型的文字。

float a = 2.225;

即将double分配给float(失去精确度,见下文)。

printf( "%.2f", ... );

这是打印double(即使您将float作为参数,由于类型提升),精度为小数点后的两位数。

float a = 2.225;
printf( "%.2f", a );

这是将double分配给float,然后将其转发回double(类型宣传),并打印出来。

printf( "%.2f", 2.225 );

这是打印double没有来回转换)。

  

印刷中的舍入规则是什么?

舍入工作正如您所期望的那样,但这不是您的问题。

输出的差异是因为您的abfloat,直接打印的文字不是。你碰巧选择了由于转换为浮动而导致精度损失的值。

  

如何在这两种情况下获得相同的打印效果?

始终如一地使用double

double a = 2.225;
double b = 123.235;