為什麼這篇printf double小數點鄉民發文收入到精華區:因為在printf double小數點這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者iForests (森林)看板b97902HW標題[計程] 你不可不知道的 double 十件事...
‧什麼是 double‧
double 也是一種資料型態,就如同熟悉的 int 一樣。不同的是,int 儲存整數資料
,而 double 放浮點數(即有小數點)。使用上和 int 類似,唯 int 使用的 %d 必須改
為 %lf。這裡一併列出所有目前用過的資料型態該用的代碼當作復習:
int→%d double→%lf long long→DevC++ 裡用 %I64d
批改娘及 ACM 用 %lld
最後補充一些厲害的用法,直接舉例說明:
#include <cstdio>
main(){
int a=38;
double b=38.0;
printf("%9d\n",a); // 38,即總位數 9 位
printf("%09d\n",a); //000000038,總位數 9 位,不足前方補 0
printf("%.3lf\n",b); //38.000 ,只印小數點後 3 位
printf("%9.3lf\n",b); // 38.000,含整數、小數點、小數共 9 位
printf("%09.3lf\n",b); //00038.000,共 9 位,不足前方補 0
}
提醒一下,諸如 %.3lf 這種都是四捨五入到小數點後三位。
‧科學計號‧ (「^」為次方符號,10^5 = 100000)
1e9 = 10^9
1e4 = 10^4
1e-5 = 10^(-5) = 0.00001
1e-10 = 10^(-10) = 0.0000000001
‧浮點數誤差‧
用到 double 時是無論如何都得提到浮點數誤差的,不過這裡只打算亂講。簡單來說
是這樣,當你放例如 5 在變數裡時,電腦有可能存 4.9999999999999999999999999999。
原則上是沒有差別,但有時候會造成影響。使徒三是個好例子,很多人寫一寫可能會發現
印出來的東西竟然有 -0.000,其原因正是因為變數值為像 -0.00000000000002147483647
這種後面接了一些怪東西的值(只是隨便打的)。因此輸出時認為它不是 0,而是一個很
小很小的負數,所以取 3 位小數時印出 -0.000。
解法方法很簡單,我們加一個很小很小又不至於太小的數給它,例如 1e-10。
-0.00000000000002147483647
+0.0000000001
------------------------------
0.00000000009997852516353
這樣一來,用 %.3lf 印出時,答案就會是 0.000 了。
‧數學函式‧ (使用前需先 #include <math.h>)
首先,π = 2.0 * acos(0.0) = 3.1415926535897932384626433832795。
↑這是確確實實的 0.0 而不是表情符號
sin()、cos() 等等函數傳入的參數必須使用弳度而非角度,轉換方法高中數學課應
有提過,總之:弳度 = 角度 * π / 180。
‧結語‧
使徒三 Go。
其實寫這篇是因為大家都很厲害或是我很失敗,總之使徒一、二幾乎沒有人問我,讓
我有種青年失業的感覺,因此希望這能有任何一點點幫助。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.242.109