#3257: _Re:


d000032002 ((選擇題)為SCWCD和專案努力)


這很可能是傳說中的「浮點數誤差」!0.812 轉成二進位後會是一個循環小數,但是電腦中的浮點數的有效位數是有限的,後面的部份就被去掉了,因此它會是一個接近 0.812 的值而不是真的 0.812。

理論上 0.812 乘上一個 250 的倍數會變成整數,但是由於它只是一個接近 0.812 的值而不是真的 0.812,所以乘出來的數不會是整數。

更糟的每個編譯器取近似值的方法不太一樣,所以很有可能你的編譯器取出來的近似值和 ZeroJudge 上的編譯器所取出來的近似值就不同,導致不同的執行結果。

這題是很好的「浮點數誤差」的教材。

解決辦法:
1. 給它一些誤差容許值。比如說先減掉 1e-12 再無條件進位。
2. 用整數來解。如果你的總價是 total (整數),那麼折扣後的金額就是 (total * 812 - 1) / 1000 + 1。
 或許用ceil這個方法就好了!!
題目要取到整數位