[英]Float (or double) to decimal fixed point integer
我想將浮點數或雙精度數轉換為C語言中的十進制定點整數。 考慮C語言的規范,我正在尋找最合適(健壯)的解決方案。
例如,問題就在於此:
double d = 15.6;
int i;
...
i = (int)(d * 10.0); /* I am excepting getting 156 in 'i' */
據我所知,該標准的相關元素(使用C99,ISO / IEC 9899:TC3,請參閱此問題進行下載):
_Bool
以外的整數類型時,小數部分將被丟棄(即,該值將被截斷為零)。 (......) 示例中的15.6
在IEEE double中沒有確切的表示形式,因此我將除d
之外將其略微提高或降低。 問題出在“稍稍低於”部分,那么示例中的i
不會得到例外的結果(而是155
)。
我的明顯做法是這樣的(僅考慮零或正值):
i = (int)(d * 10.0 + 0.5);
至少如果我正確解釋了C標准。 我之所以問是因為,由於“實現定義的”行為,人們可能會遇到一致的結果,而實際上某些其他實現可能會破壞程序,因此反復試驗並不是找到適當解決方案的適當方法。
尤其是以下問題與該問題有關,我認為該問題的答案不正確。
C99為此指定了一個舍入函數。 使用它,然后轉換為int。
更新:對於C89,您可以嘗試
double y = floor(x);
double z = x == y ? x : floor(2.0*x-y);
這應該與C99 round
相同,不同之處在於小數部分等於0.5的負數將向上舍入(如Java),並且零可能會被錯誤地簽名(這是基於Arch Robinson的類似技巧)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.