我发现VC中对浮点数的类型转化好象有点问题,请看如下程序:double d1=1.16;
double d2=d1*25.0;//d2为29
int i=(int)d2;i的正确结果应该为29,可程序的结果是28,象这样的错误在很多地方还存在,有谁知道该如何解决吗?
double d2=d1*25.0;//d2为29
int i=(int)d2;i的正确结果应该为29,可程序的结果是28,象这样的错误在很多地方还存在,有谁知道该如何解决吗?
解决方案 »
- vc调用activex 控件REALPLAYER G2 CONTROL,可以编译通过,但是程序无法运行
- C++Builder6.0 界面组件的加载与使用?
- mfc中CArray不就够了,搞些CByteArray,CUIntArray,CStringArray,CObArray,CPtrArray干什么?
- 关于在调用动态链界库出现的错误
- 请教:如何用VC/MFC读取RSS的内容
- 一个简单的问题:我在VC中自定义工具栏后,VC将结果保存在何处?
- 如何锁定屏幕?
- 为什么不能产生dlldata.obj?
- 转让Tech.ED 2009微软技术大会门票(北京)
- 侯捷先生说...
- DAO插记录的问题
- 是不是VC6的bug?(Missing ; before identifier)
当你用int强制转化时, 它是用截断。
所以28.99999999就会变为28.可改为:
int i=(int)(d2+0.5);
就会四舍五入了。
连负数都想到了。
因为1.16没法完全正确的在计算机上表示(用二进制永远无法表示出1.16),所以就出现了截断溢出,表示的值就只能比1.16小。它再跟25相乘,于是结果就比29稍微小一点。解决:
一般你在结果后加一个小小的epsilon来调整,如
#define epsilon 0.000000001
于是你定义一个转换函数
int f2n(double d)
{
return int(d+epsilon);
}
当然,如果是负数有可能是-epsilon,到底是加是减,自己作试验再说
这是常用而且好用的一种四舍五入的方法!
赞同!
推荐!
祝你进步|!
int i = (int)d2 + 1;