c ++一半甚至四舍五入到x位数

时间:2018-02-15 02:54:07

标签: c++ rounding bankers-rounding

给定一个浮点数,我想使用半偶数舍入将结果舍入到4位小数,即舍入到下一个偶数方法。例如,当我有以下代码片段时:

#include <iostream>
#include <iomanip>

int main(){
    float x = 70.04535; 
    std::cout << std::fixed << std::setprecision(4) << x << std::endl;
}

输出为70.0453,但我想成为70.0454。我在标准库中找不到任何东西,有没有实现这个功能?如果没有,自定义功能会是什么样的?

2 个答案:

答案 0 :(得分:2)

如果您使用float,那么您可以在这里搞砸了。没有70.04535这样的值,因为它在IEEE 754二进制浮点中无法表示。

使用Python的decimal.Decimal类轻松演示,它将尝试重现实际的float(嗯,Python float是C double,但它& #39; s相同的原则)输出精确到30位的数字:

>>> import decimal
>>> decimal.Decimal(70.04535)
Decimal('70.0453499999999991132426657713949680328369140625')

因此,您的实际值不会以5结尾,而是以49999结尾...(最接近70.04535 C double可以得到; C float是更不精确);即使是银行家的四舍五入也会将其四舍五入。如果这对您的程序很重要,则需要使用匹配&#34; human&#34;的等效C或C ++库。 (基数为10)数学期望,例如libmpdec(这是Python decimal.Decimal在幕后使用的内容)。

答案 1 :(得分:0)

我确信有人可以改善这一点,但它可以完成工作。

double round_p( double x, int p ){                                        
    double d = std::pow(10,p+1);                                          
    return ((x*d)+5)/d;                                                   
}                                                                         
void main(int argc, const char**argv){                                    
    double x = 70.04535;                                                  
    {                                                                     
        std::cout << "value " << x << " rounded " << round_p(x,4) << std::endl;
        std::cout << "CHECK " << (bool)(round_p(x,4) == 70.0454) << std::endl; 
    }                                                                     
}