2014-09-02 40 views
0

我得到錯誤的值,同時將浮到無符號整數四捨五入問題,而CONVER浮到無符號短

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) 

試圖用圓形和小區功能,但仍然得到錯誤的答案

+0

'round'應給予正確的結果 - 你確定你正確使用它? – 2014-09-02 11:01:24

+0

[看起來不錯](http://coliru.stacked-crooked.com/a/73b541ddbfdab551)(我第一次使用了圓形,但第二次使用時也是這樣)。在第一種情況下需要循環只是由於浮點計算的樂趣所致:10.0 * 189.20爲您提供了正確的答案。在第二種情況下,這是因爲一個演員以某種方式截斷數據,因此1845.9變爲1845. – Nelfeal 2014-09-02 11:09:34

+0

@PaulR在VC的情況下是。但一般來說,'double'類型(由'round'返回)不能保證是IEEE 754,並且允許所有整數都有_exact_表示。因此,我們可能會在截斷結果後發生的情況比預期的要少。 (我試圖用我的答案中的「float」來說明它。) – AlexD 2014-09-06 22:30:48

回答

2

如果C++編譯器uses IEEE 754你可以嘗試round功能:

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

但是,假設除法的結果是不可否定的,下面的AP proach可能更好:

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

原因是,對於浮點積分轉換,小數部分只是被丟棄。因此,如果舍入函數不能表示準確的整數值N,並且返回的值「略小於」N,則在投射後我們會得到N-1

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

其輸出

16777217 16777216 

儘管所描述的問題不應在IEEE 754和round功能的情況下發生:

這個問題可以通過以下的(IEEE 754兼容)代碼來說明(因爲round返回double,它允許精確表示整數),但第一種方法看起來不太方便,因爲我們必須牢記所有這些假設。

+0

我確實喜歡這樣Data = round(mData)* 100)/ 100; – Sijith 2014-09-02 11:06:56

+0

@Sijith你需要四捨五入'/'的結果 - 而不是一個參數。 (括號內是不平衡的。) – AlexD 2014-09-02 11:10:35

+0

@Sijith我更新了答案,你也可以看看第二個選項。 – AlexD 2014-09-06 22:25:32

0

我有什麼tried-

#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; 
} 

輸出 -

[email protected]:~/My Docs/Programs# ./a.out 
1892 
1845