iT邦幫忙

0

Python 小數點運算問題

  • 分享至 

  • xImage

請各位大大幫忙解答,我是剛學python的新手,不曉得為什執行程式後,答案應該是-10.4
但不曉得為啥會是-10.399999999999999,請幫忙解惑,感謝

程式碼:

number1 = input("請輸入第一個數字: ")
print(float(number1))
number2 = input("請輸入第二個數字: ")
print(float(number2))

number = float(number1) + float(number2)
number = float(number)

print(number)

結果:

請輸入第一個數字: -8.2
-8.2
請輸入第二個數字: -2.2
-2.2
-10.399999999999999
rofellos iT邦新手 2 級 ‧ 2022-04-01 12:37:02 檢舉
因為你用float?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
一級屠豬士
iT邦大師 1 級 ‧ 2022-04-01 00:21:07

因為浮點數(flot)計算會有誤差的.若要精確度較高,可以使用 Decimal
https://docs.python.org/3.9/library/decimal.html

可以參考
https://ithelp.ithome.com.tw/upload/images/20220401/20050647kdZqLtCGNc.png

才小數點一位
而且是加法,不是除法
就有這種精確度的差異
/images/emoticon/emoticon09.gif

用蟹堡王餐廳的贈品都不會算錯了
還什麼元宇宙哩
/images/emoticon/emoticon06.gif
https://ithelp.ithome.com.tw/upload/images/20220401/20001787rPh2GCgl1m.jpg
https://ithelp.ithome.com.tw/upload/images/20220401/20001787v89f79I5he.jpg
https://ithelp.ithome.com.tw/upload/images/20220401/20001787wMT5WKimz3.jpg

ShawnGood iT邦新手 5 級 ‧ 2022-04-02 10:19:42 檢舉

請享用![/images/emoticon/emoticon37.gif]
(/images/emoticon/emoticon37.gif)
IEEE-754 與浮點數運算
https://ithelp.ithome.com.tw/articles/10266532

0
小魚
iT邦大師 1 級 ‧ 2022-04-01 08:09:02

因為預設計算是2進位的,
要改成10進位的decimal.

0

認真來說,電腦的程式計算。它其實只會「加」法。
計算的過程全是用2進位的方式來計算的。

這其實不只在Python會發生,幾乎所有的程式都會有同樣的情況。
所以一般來說,得要看程式裏是否有提供精準數類型的東西來處理。
或是自已手動處理。

早期我都會用字串或是四捨五入的方式來處理。
現在大多比較偏向用物件或是套件來處理。

4
grimmq52156
iT邦新手 5 級 ‧ 2022-04-01 09:42:28

前面有大大跟你說解法了,我這邊補充一下,程式語言中關於Floating-Point Arithmetic(浮點數)的小知識。

本文主要引用或翻譯自THE FLOATING-POINT GUIDE,若想更深入了解浮點數二三事,以及各語言對於浮點數運算的最佳實例,很推薦這個網站!

為什麼會出現這個問題?

基本上,我們電腦使用的浮點數格式,其實無法精確表示像0.1、0.2、0.3這種數字,當程式被執行或編譯的時候,在浮點數格式中,你看到的0.1其實是被四捨五入過,最接近0.1的數字,所以存在著一點點的四捨五入誤差,而這誤差甚至在浮點數被運算前就已經存在。

只有python會有這種問題嗎?

除了python外,好幾個語言(如C#、Java、JavaScript、Perl、PHP、Python、Ruby、Rust、SQL)也有浮點數運算的問題,我在PHP被雷過一次,在JavaScript又被雷一次…

python怎麼處理這種問題?

解決方式就像前兩樓的大大所說,使用python的Decimal類型即可:

from decimal import * # import decimal
getcontext().prec = 6 # 設定你要精度,預設為28

number1 = input("請輸入第一個數字: ")
print(Decimal(number1))
number2 = input("請輸入第二個數字: ")
print(Decimal(number2))

number = Decimal(number1) + Decimal(number2)
number = Decimal(number)

print(number)

小結論

在一般情況下,浮點數運算或許不會有什麼大問題,頂多就是結果看起來有點嚇人(?),但在對精確度要求很嚴格的情況(例如購物車的金額計算),忽略浮點數問題造成的後果……嗯,大概就是這樣,所以請把浮點數運算問題謹記在心

cssmiley iT邦新手 5 級 ‧ 2022-04-03 19:55:28 檢舉

目前也在學習中,補充一下一本推薦書籍有中文書 Python功力提升的樂趣 樓主的問題可以參考這一小節 Don’t Assume Floating-Point Numbers Are Perfectly Accurate
書中也有介紹很多python會遇到的地雷

0
海綿寶寶
iT邦大神 1 級 ‧ 2022-04-01 10:01:28

因為你用的是 python3
https://ithelp.ithome.com.tw/upload/images/20220401/20001787QGZI5mHk41.png

如果用 python 2 就正常了
https://ithelp.ithome.com.tw/upload/images/20220401/20001787421cxpdIZ1.png

至於為什麼,我不知道
/images/emoticon/emoticon25.gif

小魚 iT邦大師 1 級 ‧ 2022-04-01 15:35:23 檢舉

/images/emoticon/emoticon01.gif

我要發表回答

立即登入回答