2015-05-02 67 views
-2

我有這兩個名單:的Python:.format()不正確四捨五入

salePrices = [9.95, 14.95, 19.95, 24.95, 29.95, 34.95, 39.95, 44.95, 49.95] 
percents = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50] 

,然後使用這個for循環中,我通過每個迭代百分比並計算折扣價。

for percent in percents: 

    for salePrice in salePrices: 
     newPrice = salePrice - ((percent/100) * salePrice) 
     print("\t" + "{0:.2f}".format(newPrice), end = " ") 
    print() 

這一切工作正常,除了一個問題:一些計算值不能正確舍入。

例如,14.95 - (0.1 * 14.95)= 13.455,應該用.format()四捨五入爲13.46。但是,打印的值是13.45。

有什麼我做錯了,或者它是方法,格式本身的問題?

+0

嘗試之前舍入.format? – Tarik

回答

3

這是你的問題:

14.95 - (0.1 * 14.95) = 13.455 

沒有,在IEEE雙打,14.95 - (0.1 * 14.95)13.454999999999998。正確地向下舍入到13.45

Here's the obligatory link to What Every Computer Scientist Should Know About Floating-Point Arithmetic

如果你想14.95實際上是完全14.95,而不是最近的二進制小數到14.95,您可能需要使用Decimal而不是float。當然Decimal也是不精確的,但最接近14.95的小數部分顯然確實是14.95。 :)

+0

甜,謝謝你:) – user2681474

+0

SO提問者==計算機科學家。大聲笑 – Barmar

+0

@Barmar:嗨,當那些不是計算機科學家的人無法使用帶FPU的計算機時,這篇文章就被寫回來了。 :) – abarnert