我正在寻找一种方法来在今天早上用c ++舍入浮点数,我发现something that's being pitched解决了我的问题。
但是,我注意到一些不寻常的事情。当我尝试将某些浮点数舍入到两位小数时,似乎1.075和1.895之类的数字遵循不同的舍入规则。具体来说,使用以下简单代码:
#include <iostream>
#include <iomanip>
int main(int argc, char** argv)
{
float testme[] = { 1.07500, 1.89500, 2.70500, 3.47500};
std::cout << std::setprecision(2) << std::fixed;
for(int i = 0; i < 4; ++i)
{
std::cout << testme[i] << std::endl;
}
return 0;
}
我的结果是
1.08
1.89
2.70
3.47
因此1.075变为1.08而1.895变为1.89。这让我很困惑。我会很感激一些解释。谢谢!
答案 0 :(得分:1)
我认为这是浮点数不能精确表示数字1.895的问题。计算机可以存储的最接近1.895的浮点值实际上是
1.894999980926513671875
,如果四舍五入到小数点后两位,实际上应该 1.89,因为在查看下一个数字后,你将向下舍入。
我设法使用this tool获得上述数字,这也可以用来解释其他值。
答案 1 :(得分:0)
大多数十进制数不能以二进制格式精确表示,因此必须进行舍入。 IEEE 754定义了此过程的几种可能性,我认为你看到了这个(来自Wikipedia的引用):
舍入到最近,与偶数舍入到最接近的值;如果数字中间下降,则使用偶数(零)最低有效位舍入到最接近的值;这是二进制浮点的默认值,也是十进制的推荐默认值。
基本上,以数字5结尾的十进制数有时会向上舍入,有时会向下舍入以避免统计偏差。