将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函数但仍然得到错误的答案
答案 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