解决浮点数自动取整问题

来源:互联网 发布:linux查看内存报错 编辑:程序博客网 时间:2024/06/05 05:13

虽然是个小问题,不过之前竟然没想过,所以还是记下来给自己一个教训~

今天在项目计算图片宽度时,遇到了一个很奇怪的问题,我的图片怎么也显示不出来~代码如下:

   m_pRenderer->Draw2dImage(m_positionX,m_positionY,m_pTexture->GetWidth()*(800/1920)*m_scale,m_pTexture->GetHeight()*(600/1080)*m_scale,                                                 m_pTexture ? m_pTexture->GetTextureID() :-1,                                                 0.0f,1.0f,1.0f,0.0f, // texcoords                                                 0.0f, // angle                                                 m_drawColor.r,m_drawColor.g, m_drawColor.b,m_drawColor.a,                                                 0.0f);


其实就是绘制图片的一个函数,红色的语句表示宽度和高度的参数~(这么写确实不是好习惯,调试起来都不方便)所以为了调试,新增了两句。

m_twidth= (m_pTexture->GetWidth())*(800.0/1920.0)*m_scale;

m_theight= (m_pTexture->GetHeight())*(600.0/1080.0)*m_scale;

 

经过调试发现计算的结果是0,立刻就反应过啦肯定是取整问题么,所以,心中一猜,那个m_pTexture->GetWidth()的宽度肯定是int型,不出我所料,随后心安理得的加一个(float)强转,两个float就行了吧。

然而。。。还是啥也没有,调试一看还是0!我想了下,还是基础不牢,换个小程序跑跑把~

代码如下:

         float num=0.0f;         num=400*(800/1920);         //num=0.03f;         cout<<num<<”__”<<800/1920<<endl;


心想可能结果是0__0(这个结果代表我的心情),果然是这样。然后我用,1920除以800,得到结果是2,很明显就是“/”自动取整了么。

不过,我想精确计算啊,突然想了想是不是声明变量时的精度不够,然后改为float num=0.0000f;当然,结果还是0__0(……)。

突然,灵光一现~

         float num=0.0f;         num=400*(800.000/1920.000);         //num=0.03f;         cout<<num<<”__”<<800/1920<<endl;


 结果变为0.4166672__0,终于对了。

 

既然提到了浮点数取整问题,这里就说一下取整吧~

一般取整有下面几个方法:

1.      把值直接赋值给int,比如int a=4.9;(这样a为4,向下取整而且一般编译器会提示你的取整有数据丢失)也可以a=(int)4.9;

2.      如果浮点型数据没有精确到小数点后几位(比如上面的800/1920)“/”号可以自动取整。

3.      使用floor函数

4.      使用ceil函数(向上取整)
0 0
原创粉丝点击