[英]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
是什么讓我說的是,雖然這是事實,許多十進制值不能精確地存儲在float
或double
,這並不適用於這種大小的整數。 它們可以很容易地以二進制浮點形式精確表示。 (非常大的整數不能總是精確表示,但我們在這里不處理非常大的整數。)
我強烈懷疑您的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 :
這稱為隱式類型轉換在此處閱讀更多信息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;
從double
到int
的轉換應該解決一些問題。
當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.