float a=float(0.01);//0.01
int m_a=int(a*100); //1float temp=a*100;//1
int m_b=int(temp);//1CString str;
str.Format("%d,%d",m_a,m_b);
MessageBox(str);//0,1
为什么不是1,1;
int m_a=int(a*100); //1float temp=a*100;//1
int m_b=int(temp);//1CString str;
str.Format("%d,%d",m_a,m_b);
MessageBox(str);//0,1
为什么不是1,1;
解决方案 »
- <NAT穿透>UPnP端口映射及udp发数据包的诡异问题~~
- vc基础问题
- 我的VTK中没有vtkParallel.lib库文件
- VC 写的计算器中如何在按下“=”键之后如果再按数字键时,清空原来显示框中的内容??
- ActiveX 控件属性问题?先拜谢!!!
- 如何截获数据包?
- 大家说说:关闭一个对话框,都执行了什么操作?
- 请教如何改变ToolBar文本的颜色
- ListView_SetBkColor(HWND hwnd, COLORREF clrBk)中最后一个参数如果是白色,怎么用?
- filedisk功能扩展,如何添加挂载验证功能?
- 怎么样让NT service在遇到故障的时候自动重起服务
- 在MFC写的进程内COM服务器里,能显示对话框么?
没什么奇怪, 浮点数的精度是有限的. 我估计 0.01f * 100,结果肯定不会正好等于一(精度问题), 那么就有两种可能,一种是比1稍大,比如: 1.0000000000000001
还有一种就是比1稍小, 比如0.999999999999999999999998如果是后一种的话,那么转换成 int 就会等于一. 因为这个转型是去尾的.不是四舍五入.
我试着用 %f 输出 a, a*100, 结果是 :
---------------------------
FLOAT TEST
---------------------------
0.010000,1.000000
---------------------------
确定
---------------------------似乎是正确的,于是我提高输出精度到20位(实际的float 精度好象不超过15位,不知道有没有记错)
然后再次输出 a, a*100, 得到下面的结果:
---------------------------
FLOAT TEST
---------------------------
0.00999999977648258210,0.99999997764825821000
---------------------------
确定
---------------------------
呵呵,看出来了,果然不是正确的 0.01 而是比 0.01 稍小一点点. 大约误差 3*10^(-10). 由此看来float 应该没有15位的精度.
str.Format("%d,%d",m_a,m_b);你可以试试这样:1、 int(m_a) + (m_a - int(m_a) > 0)//取上值,
1、 int(m_a) + (m_a - int(m_a) >= 0.5)//四舍五入
会不会编译器将a先自动转换成了int类型,然后再进行了*100,最后赋值给m_a--所以结果为0.(猜测)
fanqing猜的不对吧?
---------------
m_a 本来就是整型, 下面这两句起什么作用?
fanqing(火影忍者+28%(准备学习进程/线程)) ( * * )
------------------------------------------------
一个浮点数跟一个整数运算,一定是先转换成浮点数的,结果是浮点,赋值给整形的时候又会进行一次转换, 就整数
VC用的是
mov DWORD PTR _a$[ebp], 1008981770 ; 3c23d70aH
; Line 5
fld DWORD PTR _a$[ebp]
fmul DWORD PTR __real@4@4005c800000000000000 //0.01*100
运算结果可以能为0.99999..,不到1.0,而int转换是调用ftol,它只会得到整形部分,就为0了
-----------------------------------------------------------------------------------
我用VC为 0,0 ,它都是调用的fmul
---------------------------------------------------
用BCB或GCC,结果为0,1,因为它用
fstp dword
取回结果时,又会有误差,把它进为1了
0.9999999776482582528(3FFE FFFFFFA0 00000000)
当然,取int后,结果为0