【问题标题】:c++ cout << [double] not printing decimal placesc++ cout << [double] 不打印小数位
【发布时间】:2013-12-06 19:18:23
【问题描述】:

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

#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 = %f\n", f);
    printf("[c] g = %f\n", 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 = %f\n", f);
    printf("[c] g = %f\n", 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 来正确强制打印双打?

【问题讨论】:

标签: c++


【解决方案1】:

有三种浮点表示法:

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

正如cplusplus.com documentation 所引用的,知道这一点也很有趣:

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


P.S.:对于 C++11,有新的符号:hexfloat 用于十六进制,defaultfloat 用于之前所谓的 (none)

【讨论】:

    【解决方案2】:

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

    根据documentation

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

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

    【讨论】:

    • 有道理,精度指的是前后数字。谢谢。
    猜你喜欢
    • 2017-12-31
    • 2014-12-28
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-11
    相关资源
    最近更新 更多