将float转换为unsigned short时舍入问题

时间:2014-09-02 10:55:48

标签: c++ c visual-c++

将float转换为无符号整数时,我得到的值不正确

TMAC_PAYLOAD_SCALE = 0.10
Data = (unsigned short)(mData / TMAC_PAYLOAD_SCALE);
189.20/0.10 = 1891  (I am expecting 1892)
184.59/0.10 = 1845  (I am expecting 1846)

尝试使用round和ceil函数但仍然得到错误的答案

2 个答案:

答案 0 :(得分:2)

如果C ++编译器uses IEEE 754可以尝试round函数:

Data = (unsigned short)round(mData / TMAC_PAYLOAD_SCALE);

然而,假设除法的结果是非负的,以下方法可能更好:

Data = (unsigned short)(mData / TMAC_PAYLOAD_SCALE + 0.5);

原因是对于浮动积分转换,小数部分才被丢弃。因此,如果舍入函数无法表示精确的整数值N,并返回“略小于”N的值,那么在投射后我们会得到N-1

此问题可通过以下(IEEE 754兼容)代码说明:

int a = 16777217;
float f = a; // not double
int b = f;
cout << a << " " << b << endl;

输出

16777217 16777216

虽然在IEEE 754和round函数的情况下不应该发生所描述的问题(因为round返回double,它允许精确表示整数),但第一种方法仍然不看非常方便,因为我们必须牢记所有这些假设。

答案 1 :(得分:0)

我尝试了什么 -

#include <stdio.h>
#include<math.h>
int main ()
{

        printf("%hd\n",(unsigned short)ceil(189.20/0.10)); // you can use ceilf also
        printf("%hd\n",(unsigned short)floor(184.59/0.10));

        return 0;
}

输出 -

root@sathish1:~/My Docs/Programs# ./a.out 
1892
1845