http://www.dewen.net.cn/q/15051/C++ 整形和浮点数相除的精度问题

http://www.dewen.net.cn/q/15051/C++ 整形和浮点数相除的精度问题

王老五
2 票
王老五 13
将一个单浮点数精确到千分位的程序

//舍入计算 精确到千分位
void rounding(float * cost)
{
int costthousand = int((*cost)*1000);
int costhundred = int((*cost)*100);

int remainder = costthousand-costhundred*10;
if( remainder>5 )
costhundred += 1;

*cost = costhundred/100.0f;
}

跟踪调试的时候发现,*cost=4.1985002,最后一个语句*cost = costhundred/100.0f;costhundred的值是420,*cost=4.1999998,为什么*cost的值不是4.200000?

brayden brayden6562 编辑于2013-10-14
评论 (0) • 举报 (0) • 分享 • 链接 • 2013-10-14 
添加评论...
1个答案 票 数
brayden认证专家
0 票
brayden6562
最佳答案
浮点数不可能完全精确, 一定会有误差.
有兴趣可以研究一下IEEE754, float是用32个bit表示的, 所以float只能表示出浮点空间里有限的点. 无法表示出来的, 只能取最近的表示了.

比如我在java里做了一下,
4.2f在内存里 用32bit表示为: 1 00000010 0001100110011001100110
换算成float为: 4.199999809265136718750
应该没有比这个更接近4.2的了.

posted @ 2016-03-10 15:49  brayden  阅读(196)  评论(0编辑  收藏  举报