簡體   English   中英

如何在 C 中將 double 轉換為 int?

[英]How to Convert double to int in C?

double a;
a = 3669.0;
int b;
b = a;

我在 b 中得到 3668,而不是 3669。

我該如何解決這個問題? 如果有這樣的 3559.8,我也想要 3559 而不是 3560。

我懷疑你實際上沒有那個問題 - 我懷疑你真的有:

double a = callSomeFunction();
// Examine a in the debugger or via logging, and decide it's 3669.0

// Now cast
int b = (int) a;
// Now a is 3668

是什么讓我說的是,雖然這是事實,許多十進制值不能精確地存儲在floatdouble ,這並不適用於這種大小的整數。 它們可以很容易地以二進制浮點形式精確表示。 (非常大的整數不能總是精確表示,但我們在這里不處理非常大的整數。)

我強烈懷疑您的double精度值實際上略小於 3669.0,但是您使用的任何診斷設備都會將其顯示為 3669.0。 轉換為整數值只是執行截斷,而不是舍入 - 因此存在問題。

假設您的double類型是 IEEE-754 64 位類型,則小於 3669.0 的最大值正好是

3668.99999999999954525264911353588104248046875

因此,如果您正在使用該值顯示為 3669.0 的任何診斷方法,那么很可能(可能,我會說)這就是正在發生的事情。

main() {
    double a;
    a=3669.0;
    int b;
    b=a;
    printf("b is %d",b);
  
}

輸出是: b is 3669

當你寫 b=a; 然后它自動轉換為 int

see on-line compiler result : 

http://ideone.com/60T5b


這稱為隱式類型轉換在此處閱讀更多信息https://www.geeksforgeeks.org/implicit-type-conversion-in-c-with-examples/

這就是臭名昭著的浮點舍入問題。 只需添加一個非常小的數字即可糾正問題。

double a;
a=3669.0;
int b;
b=a+ 1e-9;

如何在 C 中將 double 轉換為 int?

快速回答。 (不滿足 OP 的隱含目標需要舍入。):

// Discard the fractional part of d - truncation.
// Well defined when the truncated d is near the int range.
int i = (int) d;

doubleint的轉換應該解決一些問題。

  • double值的小數部分接近 1.0 時該怎么辦,就像 OP 的真實情況一樣? 通常首選舍入值。

  • 如何檢測/處理超出int范圍的double

  • 無窮大和非數字呢?

如果范圍檢測不重要,則使用long lround(double)一步進行舍入和轉換:“...將它們的參數舍入到最接近的 integer 值,從零開始舍入一半,無論當前舍入方向如何”。

#include <math.h>
int = (int) lround(d); // Since C99.

如果范圍檢測很重要,首先使用double數學來檢測范圍。 注意將邊緣情況測試正確轉換為從[INT_MIN - 0.9999... to INT_MAX + 0.9999...]int有效。 確保使用的數學/值是准確的。 (double) 當int的值位多於double的精度時, (double) INT_MAX可能會丟失精度。

#include <limits.h>
#define INT_MAX_PLUS1  ((INT_MAX/2 + 1)*2.0)
#define INT_MIN_MINUS1 ((INT_MIN/2 - 1)*2.0)

#if INT_MIN == -INT_MAX
// Rare non-2's complement
if ((d < INT_MAX_PLUS1) && (d > INT_MIN_MINUS1)) {
#else
// 2's complement
if ((d < INT_MAX_PLUS1) && (d + INT_MIN > -1.0)) {
#endif

  i = (int) lround(d);

} else {
  fprintf(stderr, "Value %.17g not in int range [%d %d]\n", INT_MIN, INT_MAX);
}

d是非數字時,通常d < INT_MAX_PLUS1為假。 C 不需要此行為,即使false很常見。 或者:

#include <math.h>
if (!isnan(d) && (d < INT_MAX_PLUS1) && (d > INT_MIN_MINUS1)) {
...
int b;
double a;
a=3669.0;
b=a;
printf("b=%d",b);

此代碼給出的輸出為 b=3669,只有您清楚地檢查它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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