Re: [問題] Change Counter程式碼錯誤
※ 引述《dream0127uk (TCK)》之銘言:
: 各位鄉民好:)
: 我現在做了一個程式是Change Counter
: 要計算你身上原來有多少錢,然後花了多久錢,結果剩下多少錢
: 另外剩下的錢當中,必須分出多少張20元 多少張 10元之類
: 我的程式碼:http://codepad.org/kzRvMbnZ
: 我不懂...
: 我輸入身上有 14119000000000
: 但是我要花 564456600485.3933
: 結果會說出剩下 13554543399514.61 (正確)
: 但是紙鈔和硬幣有多少個... 就完全錯誤了...
: 救命 ... 我已經快頭暈死了...
: 謝謝各位幫忙:)
這有幾個問題再裡面.
1. 有效位數的問題, double 只可以有10進位的15位有效位數,
這跟你用的系統, compile 有關.
你上面的例子有14位, 16位數.
http://msdn.microsoft.com/zh-tw/library/system.double(v=vs.80).aspx
2. 還有 printf 4 捨 5入的問題.
你可以試著將%.2f 改為%.4f , 答案可能就會對了.
or printf("%.2f, result*100); //用 x100 去看後面的有效數值
3. 輸入的問題, scanf 對小數的問題,
或是說 double 對 scanf的表示法問題, 這比較難解釋.
用你上面的例子0.125=1/8, 是有限位2進位可完全表示的
0.12, 表面上是有限10進位, 但對2進位來說確是要無限小數位.
這也會造成對4 捨 5入的另一影響, 有時我們認知的0.005 其實是
0.0049999999999.. , 或是 0.00500000000000000000000001
這兩個結果當然就不一樣.
你先用比較小的數試看看結果對不對. 如萬以內,
如果對了, 表示你的程式是沒有問題的,
還有一個方法, 如你要處理的數只到 0.001,
那你可以在你輸入時 先將 數 x1000, 如0.12 --> 120, 0.125 -->125
這樣就沒有 3 的問題.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 219.80.130.78
※ 編輯: bbearh 來自: 219.80.130.78 (04/22 13:53)
推
04/22 14:05, , 1F
04/22 14:05, 1F
推
04/22 14:15, , 2F
04/22 14:15, 2F
→
04/22 16:04, , 3F
04/22 16:04, 3F
→
04/22 16:04, , 4F
04/22 16:04, 4F
推
04/22 22:50, , 5F
04/22 22:50, 5F
→
04/24 23:08, , 6F
04/24 23:08, 6F
推
04/25 01:31, , 7F
04/25 01:31, 7F
→
04/25 01:32, , 8F
04/25 01:32, 8F
→
04/25 01:32, , 9F
04/25 01:32, 9F
→
04/25 09:51, , 10F
04/25 09:51, 10F
→
04/25 09:52, , 11F
04/25 09:52, 11F
→
04/25 09:52, , 12F
04/25 09:52, 12F
→
04/25 09:52, , 13F
04/25 09:52, 13F
→
04/25 09:53, , 14F
04/25 09:53, 14F
→
04/25 09:53, , 15F
04/25 09:53, 15F
推
04/25 12:38, , 16F
04/25 12:38, 16F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):