【问题标题】:Division by 1000 rounds off double var and loses the decimal places [duplicate]除以 1000 舍入 double var 并丢失小数位 [重复]
【发布时间】:2020-03-08 03:45:10
【问题描述】:
#include<iostream>
using namespace std;

int main()
{
    unsigned int x = 293125555;

    double y =  (double)x/1000.0;

    cout << y << endl;

    return 0;
}

我希望输出为 293125.555,但我得到的是 293126。 这是因为 double 存储在内存中的方式吗?

【问题讨论】:

  • @balraj 没有变量精度之类的东西。这仅受类型本身的限制(例如,float 不如 double 精确)。 y 已经存储了 293125.555(您可以使用调试器对其进行验证),但是您以 6 位有效数字的精度打印它。
  • @balraj 变量的精度仅取决于变量类型以及您的体系结构和编译器。 cppreference.com 说double:“通常是 IEEE-754 64 位浮点类型”
  • 在 gdb 中,它说 (gdb) p y $1 = 293125.55499999999
  • 足够好(也就是double)。

标签: c++ double


【解决方案1】:

std::numeric_limits&lt;T&gt; in limits:

在库编译的特定平台中提供有关算术类型(整数或浮点)属性的信息。

std::setprecision in iomanip:

设置用于在输出操作中格式化浮点值的小数精度。

所以,你可以使用:

#include <iostream>
#include <iomanip>  // setprecision()
#include <limits>

using namespace std;

int main()
{
    unsigned int x = 293125555;
    double y = (double)x/1000.0;

    cout << setprecision(numeric_limits<double>::digits10 + 1)
         << y
         << endl;

    return 0;
}

并得到预期的结果:

293125.555

【讨论】:

    【解决方案2】:

    您的问题是由cout 引起的。在将cout用作描述器here之前,您应该为cout设置精度配置

    [precision:] 管理 std::num_put::do_put 执行的浮点输出的精度(即生成多少位数)。

    您应该像这样修改您的代码以获得预期的结果:

    cout.precision(3);
    cout << y << endl;
    

    【讨论】:

    • 您的报价有误。它不是关于“浮点运算”而只是输出,正确的引用是:“管理 std::num_put::do_put 执行的浮点输出的精度(即生成多少位)。”
    • @foreknownas_463035818 我同意它是关于输出的,但由于精度是 std::ios_base 的成员函数,如引用中所述,在这种情况下,单词 operation 的合理含义将成为Input/Output
    • 实际上,我发现您的帖子暗示引用来自您提供的链接,但事实并非如此,这更“错误”。在正确的上下文中阅读报价时,带有“操作”的意思是“输出操作”的东西很好,尽管 OP 似乎对此有问题:区分值的精度和操作的精度与输出的精度
    • 你为什么一直说这是一个“报价”?也许你放错了链接,这句话不是你发布的链接的引用。很抱歉提出这一点,但从字面上解释和引用是不同的事情。
    • 检查here。我只是放了那个确切功能的链接。
    猜你喜欢
    • 2021-12-18
    • 2011-02-18
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多