我在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
印刷中的舍入规则是什么?如何在这两种情况下获得相同的打印效果? 非常感谢。
答案 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
(没有来回转换)。
印刷中的舍入规则是什么?
舍入工作正如您所期望的那样,但这不是您的问题。
输出的差异是因为您的a
和b
是float
,直接打印的文字不是。你碰巧选择了由于转换为浮动而导致精度损失的值。
如何在这两种情况下获得相同的打印效果?
始终如一地使用double
。
double a = 2.225;
double b = 123.235;