【问题标题】:C++ double precision and rounding offC++ 双精度和四舍五入
【发布时间】:2011-07-29 14:54:41
【问题描述】:

我有以下问题:

double a = 6.005; double b = 5.995;

我想在点后设置双精度2位数,例如

double c = a+b;// I would like to get 11.99 not 12.00

我该怎么做?

【问题讨论】:

  • 请解释一下a*b应该是什么。 double 当然是浮点类型,你的点不浮动。
  • 能否请 OP 编辑​​问题,现在很清楚,需要 a = 6.005 -> 6.00 等?

标签: c++ double rounding double-precision


【解决方案1】:

精度是一回事;四舍五入的展示是另一回事。

我认为这是错误的想法。您应该希望获得所有可以得到的精度,并担心在结果完成后显示舍入。

更新:

您不应该使用双精度来表示货币。上次我看的时候,C++ 是一种面向对象的语言。您应该为 Money 创建一个抽象,它做正确的事情并将这些细节从类的客户中抽象出来。

如果您使用美元工作,您可以创建一个 Money 类来管理以美分表示的货币的私有表示。使用整数进行所有计算并在最后渲染。

【讨论】:

  • +1 我完全同意...四舍五入应该是计算的最后一步
  • 假设这个双倍意味着美元和美分!那我就不可能有 11 美元和 995 美分。所以我想知道 C++ 中是否有任何现成的函数可以为我 11.995==>11.99
  • IIRC,银行通常以微美元计算。是的,那是 6 个额外的数字,而不是 2 个。
【解决方案2】:

我想在点后设置双精度 2 位

只需乘以 100 并使用整数。

【讨论】:

    【解决方案3】:

    您可能应该使用定点数字:

    unsigned int a = 600;
    unsigned int b = 599;
    
    unsigned int c = a + b;
    
    unsigned int make_fixed(double d) { return d * 100; }
    
    void print_fixed(unsigned int n) { std::cout << n/100 << "." << n%100; }
    

    【讨论】:

      【解决方案4】:

      不,您要么需要一一调整所有值(mul 乘以 100,加入 int 部分,div 乘以 100),或者您需要编写自己的 MySpecialDouble 类(在幕后做同样的事情)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-22
        • 1970-01-01
        • 1970-01-01
        • 2022-06-14
        • 2017-11-26
        • 1970-01-01
        • 2021-05-27
        • 1970-01-01
        相关资源
        最近更新 更多