给定一个浮点数,我想使用半偶数舍入将结果舍入到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
。我在标准库中找不到任何东西,有没有实现这个功能?如果没有,自定义功能会是什么样的?
答案 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;
}
}