看板 C_and_CPP 關於我們 聯絡資訊
最近小弟剛開始學C++ 使用的是VS 但是有一個題目我都想不通怎麼寫才對... 題目是設一個數字123.456 OUTPUT出來會是123.455 我用正常的寫法都寫不出來... 我是這樣寫的 float a; a = 123.456; printf("%0.2f\n",a); system("pause"); 可是不管我怎麼改都沒辦法得到123.455.. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 23.242.46.139 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1440992796.A.33A.html
stupid0319: 這樣改就可以了 printf("123.455"); 08/31 11:52
Leadgen: 樓上真是聰明~ 08/31 11:57
david830317: 難道這題只在多加一個浮點.. 08/31 12:00
david830317: 或者一樓大大的辦法嗎? 08/31 12:00
bdvstg: 這題目之前應該有講原因吧? 你有看嗎? 08/31 12:10
david830317: b大沒有欸...這題目是在講浮點的時候有的.. 08/31 12:19
david830317: 前面是在講解"%8.2f\n" output後會出現什麼.. 08/31 12:20
EdisonX: 那你弄清楚8.2是什麼意思了嗎?去查。 08/31 12:31
david830317: E大我知道阿...可是這題我還是想不出來.. 08/31 12:38
reinhert: std::cout << a; 不是更簡單? 08/31 12:49
bdvstg: http://goo.gl/9gTEZn 看一下5.捨位誤差之後的 08/31 12:50
bdvstg: 版規13誡的第11 也可以看一下 08/31 12:53
bdvstg: 其實看板規13誡第11的那個比較完整 不過內容比較多就是 08/31 12:55
bdvstg: 然後既然你知道%8.2f代表什麼意思 怎麼還會用%0.2f ? 08/31 12:57
david830317: 謝謝b大..我會用%0.2f是想試試看OTZ 08/31 13:02
james732: 改用char *也行 (喂) 08/31 14:12
EdisonX: 你真知道的話就不會寫 %0.2f 了 , 前面的 0 根本無義。 08/31 14:15
david830317: E大 我會打0.2純粹是因為平常的習慣,我當然知道0無 08/31 23:17
david830317: 義不過就很順手打了上去 08/31 23:17
bibo9901: 哪來的習慣... 08/31 23:32
david830317: 平常打字聊天的習慣.. 09/01 00:55
longlongint: 用 double 啊 09/01 08:04
Killercat: 改double應該是最直覺的 09/01 13:09
Killercat: 不過你位數一多一樣會出包.... 09/01 13:10
MOONRAKER: 順手打上去咧 藉口有夠多的 09/01 16:29
stu85010: 靠我快笑死了XDXDXDXD 09/01 17:05
david830317: 謝謝long大跟K大 09/02 00:37
david830317: 另外M大跟s大,我平常跟別人聊天打字就是會完整打出 09/02 00:37
david830317: 而我又是剛學程式的新手,會把打字時的習慣打在程式裡 09/02 00:38
david830317: 這算什麼藉口嗎??如果你們很看不慣這樣的打法 09/02 00:39
david830317: 那我會改,也謝謝你們來留言 09/02 00:39
LPH66: 事實上格式字串裡 % 後面的 0 跟其他數字不是一起解釋的 09/02 00:40
LPH66: % 後面的 0 表示輸出的數字前面補 0, 後面可以跟著長度 09/02 00:40
LPH66: 因此有 %08.2f 這種寫法, 表長度 8 小數點 2 前面補 0 09/02 00:41
LPH66: 那 %0.2f 這變成不指定長度, 因此補 0 也無意義 09/02 00:41
LPH66: 這並不是你所想的"完整欄位格式"的樣子 09/02 00:43
stupid0319: 其實不要常常撿現成的含數來用比較好 09/02 12:25
stupid0319: 把浮點數變字串沒有很困難 09/02 12:26
bdvstg: 我原本以為題目是要說浮點數的不精確 但突然發現printf 09/02 14:38
bdvstg: 會四捨五入(以前都沒注意過XD) 現在有點不確定用意了... 09/02 14:39
bdvstg: 給値123.456 卻要印出123.455 (其實是要自己寫轉字串?) 09/02 14:42
bdvstg: 不管123.4560000...或是123.4559999... %.3f都是123.456 09/02 14:52
Killercat: 重點是有效位數。Float是6還是7位, Double是23位 09/02 18:41
Killercat: 總位數只要高於有效位數 就一定會出包 09/02 18:42
Killercat: 誒說錯 Double是15位.... 09/02 18:43
Killercat: 這大約可以從你整數位的數目估算出你大概剩下幾個有效 09/02 18:44
Killercat: 位數可以用在小數位,這是很常見的tuning 09/02 18:44
Killercat: C++對這方面支援頂多就多一個不常見的long double而已 09/02 18:45
Feis: 有效位數嚴格來說要看進位法 09/02 18:58
yvb: 只好 a = 123.456 + 1e13 - 1e13; 了 09/03 17:09