C++ COUT << [double] 不打印小数位

c++ cout << [double] not printing decimal places

本文关键字:lt 打印 小数 COUT C++ double      更新时间:2023-10-16

我有一个简单的C++程序,我想它会打印出f和g中定义的双精度值作为双精度。。。但是C++将它们打印为整数。我检查了cout的默认精度,当我运行它时,输出显示默认精度应该是6,所以我很困惑为什么double没有正确打印。

#include <iostream>
#include <stdio.h>
int main() {
    double f = 735416.416898;
    double g = f + 0.3;
    std::cout << "default precision is " << std::cout.precision() << std::endl;
    std::cout << "[c++] f = " << f << std::endl;
    std::cout << "[c++] g = " << g << std::endl;
    printf("[c] f = %fn", f);
    printf("[c] g = %fn", g);
    f = 735416.516898;
    g = f + 0.3;
    std::cout << "[c++] f = " << f << std::endl;
    std::cout << "[c++] g = " << g << std::endl;
    printf("[c] f = %fn", f);
    printf("[c] g = %fn", g);
    return 0;
}

我看到的输出是:

kiran@kiran-VirtualBox:~/test$ g++ -o test test.cpp 
kiran@kiran-VirtualBox:~/test$ ./test 
[c++] f = 735416
[c++] g = 735417
[c] f = 735416.416898
[c] g = 735416.716898
[c++] f = 735417
[c++] g = 735417
[c] f = 735416.516898
[c] g = 735416.816898

因为默认精度显示为6,所以cout不应该也显示小数点后6位吗?

如果我做

std::cout << std::fixed << f

它打印正确(包括所有小数点)。

只是想知道是否有人能向我解释这种行为?这是意料之中的事吗?我是否应该使用std::fixed来强制正确打印双打?

这是因为默认表示法和固定表示法之间的区别。

根据文件,

  • 使用默认的浮点表示法,精度字段指定总共显示的最大有意义数字数,包括小数点之前和之后的数字。请注意,它不是最小值,因此,如果显示的数字的位数少于精度,则它不会用尾随零填充显示的数字
  • 在固定符号和科学符号中,精度字段精确指定小数点后显示的位数,即使这包括尾随小数零点。在这种情况下,小数点之前的数字与精度无关(增加了重点)

流使用默认的浮点表示法,直到(或除非)您将其切换为固定或科学表示法。由于您的数字在小数点之前有六位数字,并且默认精度也设置为六,因此浮点数看起来像整数。

有三种浮点符号:

  • 用于定点表示法的std::fixed
  • std::scientific用于科学记数法
  • (none)默认表示法

默认的表示法只是使用精度值来计算数字的所有数字,而不仅仅是小数部分。如果您使用一个短数字(如3.1415),您可以看到该数字显示正确。

同样有趣的是,正如cplusplus.com文档所引用的,知道:

默认表示法可以通过调用str.unsetf(ios_base::floatfield)来选择


附言:对于C++11,有新的符号:hexfoat表示十六进制,defaultfloat表示之前的(none)