【问题标题】:c++ different print behavior between values and variablesc ++值和变量之间的不同打印行为
【发布时间】:2016-07-29 13:58:19
【问题描述】:

我在 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

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

【问题讨论】:

  • 我认为区别在于floats 和doubles。
  • 问题不在于打印——你得到不同的输出,因为你传递了不同的输入。在第一种情况下,当您将 double 值分配给 float 变量时,您会失去精度。
  • 这是出现“C/C++”标签问题的问题之一。代码中没有任何专门针对 C++ 的内容。这应该重新标记C吗? C 标签是否应该添加?在“C”标签下是否应该有另一个问题问同样的事情?我放弃了。

标签: c++ c printf


【解决方案1】:

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

#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 

【讨论】:

    【解决方案2】:
    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多