[問題] C++小問題求解

看板C_and_CPP作者 (david810376)時間8年前 (2015/08/31 11:46), 編輯推噓7(7043)
留言50則, 15人參與, 最新討論串1/1
最近小弟剛開始學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

08/31 11:52, , 1F
這樣改就可以了 printf("123.455");
08/31 11:52, 1F

08/31 11:57, , 2F
樓上真是聰明~
08/31 11:57, 2F

08/31 12:00, , 3F
難道這題只在多加一個浮點..
08/31 12:00, 3F

08/31 12:00, , 4F
或者一樓大大的辦法嗎?
08/31 12:00, 4F

08/31 12:10, , 5F
這題目之前應該有講原因吧? 你有看嗎?
08/31 12:10, 5F

08/31 12:19, , 6F
b大沒有欸...這題目是在講浮點的時候有的..
08/31 12:19, 6F

08/31 12:20, , 7F
前面是在講解"%8.2f\n" output後會出現什麼..
08/31 12:20, 7F

08/31 12:31, , 8F
那你弄清楚8.2是什麼意思了嗎?去查。
08/31 12:31, 8F

08/31 12:38, , 9F
E大我知道阿...可是這題我還是想不出來..
08/31 12:38, 9F

08/31 12:49, , 10F
std::cout << a; 不是更簡單?
08/31 12:49, 10F

08/31 12:50, , 11F
http://goo.gl/9gTEZn 看一下5.捨位誤差之後的
08/31 12:50, 11F

08/31 12:53, , 12F
版規13誡的第11 也可以看一下
08/31 12:53, 12F

08/31 12:55, , 13F
其實看板規13誡第11的那個比較完整 不過內容比較多就是
08/31 12:55, 13F

08/31 12:57, , 14F
然後既然你知道%8.2f代表什麼意思 怎麼還會用%0.2f ?
08/31 12:57, 14F

08/31 13:02, , 15F
謝謝b大..我會用%0.2f是想試試看OTZ
08/31 13:02, 15F

08/31 14:12, , 16F
改用char *也行 (喂)
08/31 14:12, 16F

08/31 14:15, , 17F
你真知道的話就不會寫 %0.2f 了 , 前面的 0 根本無義。
08/31 14:15, 17F

08/31 23:17, , 18F
E大 我會打0.2純粹是因為平常的習慣,我當然知道0無
08/31 23:17, 18F

08/31 23:17, , 19F
義不過就很順手打了上去
08/31 23:17, 19F

08/31 23:32, , 20F
哪來的習慣...
08/31 23:32, 20F

09/01 00:55, , 21F
平常打字聊天的習慣..
09/01 00:55, 21F

09/01 08:04, , 22F
用 double 啊
09/01 08:04, 22F

09/01 13:09, , 23F
改double應該是最直覺的
09/01 13:09, 23F

09/01 13:10, , 24F
不過你位數一多一樣會出包....
09/01 13:10, 24F

09/01 16:29, , 25F
順手打上去咧 藉口有夠多的
09/01 16:29, 25F

09/01 17:05, , 26F
靠我快笑死了XDXDXDXD
09/01 17:05, 26F

09/02 00:37, , 27F
謝謝long大跟K大
09/02 00:37, 27F

09/02 00:37, , 28F
另外M大跟s大,我平常跟別人聊天打字就是會完整打出
09/02 00:37, 28F

09/02 00:38, , 29F
而我又是剛學程式的新手,會把打字時的習慣打在程式裡
09/02 00:38, 29F

09/02 00:39, , 30F
這算什麼藉口嗎??如果你們很看不慣這樣的打法
09/02 00:39, 30F

09/02 00:39, , 31F
那我會改,也謝謝你們來留言
09/02 00:39, 31F

09/02 00:40, , 32F
事實上格式字串裡 % 後面的 0 跟其他數字不是一起解釋的
09/02 00:40, 32F

09/02 00:40, , 33F
% 後面的 0 表示輸出的數字前面補 0, 後面可以跟著長度
09/02 00:40, 33F

09/02 00:41, , 34F
因此有 %08.2f 這種寫法, 表長度 8 小數點 2 前面補 0
09/02 00:41, 34F

09/02 00:41, , 35F
那 %0.2f 這變成不指定長度, 因此補 0 也無意義
09/02 00:41, 35F

09/02 00:43, , 36F
這並不是你所想的"完整欄位格式"的樣子
09/02 00:43, 36F

09/02 12:25, , 37F
其實不要常常撿現成的含數來用比較好
09/02 12:25, 37F

09/02 12:26, , 38F
把浮點數變字串沒有很困難
09/02 12:26, 38F

09/02 14:38, , 39F
我原本以為題目是要說浮點數的不精確 但突然發現printf
09/02 14:38, 39F

09/02 14:39, , 40F
會四捨五入(以前都沒注意過XD) 現在有點不確定用意了...
09/02 14:39, 40F

09/02 14:42, , 41F
給値123.456 卻要印出123.455 (其實是要自己寫轉字串?)
09/02 14:42, 41F

09/02 14:52, , 42F
不管123.4560000...或是123.4559999... %.3f都是123.456
09/02 14:52, 42F

09/02 18:41, , 43F
重點是有效位數。Float是6還是7位, Double是23位
09/02 18:41, 43F

09/02 18:42, , 44F
總位數只要高於有效位數 就一定會出包
09/02 18:42, 44F

09/02 18:43, , 45F
誒說錯 Double是15位....
09/02 18:43, 45F

09/02 18:44, , 46F
這大約可以從你整數位的數目估算出你大概剩下幾個有效
09/02 18:44, 46F

09/02 18:44, , 47F
位數可以用在小數位,這是很常見的tuning
09/02 18:44, 47F

09/02 18:45, , 48F
C++對這方面支援頂多就多一個不常見的long double而已
09/02 18:45, 48F

09/02 18:58, , 49F
有效位數嚴格來說要看進位法
09/02 18:58, 49F

09/03 17:09, , 50F
只好 a = 123.456 + 1e13 - 1e13; 了
09/03 17:09, 50F
文章代碼(AID): #1LuyuSCw (C_and_CPP)