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

c++ different print behavior between values and variables

本文关键字:打印 变量 之间 c++      更新时间:2023-10-16

我在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++——版本

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

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

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

#include <stdio.h>
int main(void)
{
    float a = 2.225;
    float b = 123.235;
    printf("round: %.2f %.2fn", a, b);
    printf("round: %.2f %.2fn", 2.225, 123.235);
    printf("round: %.2f %.2fn", 2.225F, 123.235F);
    return 0;
}

输出:

round: 2.22 123.24 
round: 2.23 123.23 
round: 2.22 123.24 
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,直接打印的文字不是。您碰巧选择了由于强制转换为浮点而导致精度损失的值。

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

始终如一地使用CCD_ 24。

double a = 2.225;
double b = 123.235;