簡體   English   中英

浮點數(或雙精度數)到十進制固定點整數

[英]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,請參閱此問題進行下載):

  • 6.3.1.4 / 1:當實數浮點型的有限值轉換為_Bool以外的整數類型時,小數部分將被丟棄(即,該值將被截斷為零)。 (......)
  • 6.4.4.2 / 3:(...)對於十進制浮點常量,(...)結果是在實現中選擇的最接近的可表示值,或者緊鄰最接近的可表示值的較大或較小的可表示值-確定的方式。 (......)

示例中的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM