1

给定一个浮点数,我想使用半偶数舍入将结果舍入到小数点后 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。我在标准库中找不到任何东西,有什么功能可以实现吗?如果不是,自定义函数会是什么样子?

4

2 回答 2

2

如果你使用float,你有点搞砸了。没有这样70.04535的值,因为它不能用 IEEE 754 二进制浮点表示。

使用 Python 的类进行简单演示decimal.Decimal,它将尝试将实际的float(好吧,Pythonfloat是 C double,但原理相同)值重现到 30 位精度:

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

因此,您的实际值不会以 5 结尾,而是以 49999 结尾...(最接近70.04535Cdouble可以获得;Cfloat更不精确);甚至银行家的四舍五入也会将其四舍五入。如果这对您的程序很重要,您需要使用与“人类”(base-10)数学期望相匹配的等效 C 或 C++ 库,例如libmpdec(这是 Pythondecimal.Decimal在后台使用的)。

于 2018-02-15T03:00:36.217 回答
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; 
    }                                                                     
}                                                                         
于 2018-02-16T03:34:52.513 回答