簡體   English   中英

為什么舍入浮點數1.4999999999999999產生2?

[英]Why does rounding the floating-point number 1.4999999999999999 produce 2?

我一直在讀一本書寫好代碼 - 理解機器 關於四舍五入的部分說:

如果十進制位值大於或等於可以表示的總十進制值的一半,則數字應舍入為最小的較大數字。

意思是:

round(1.5) // equals 2
round(1.49) // equals 1

但是當我用Python嘗試這個時:

x1 = 1.4999  # rounds to 1

x2 = 1.4999999999999999  # rounds to 2

print(round(x1))

print(round(x2))

輸出是:

1

2

我用C#和Swift嘗試了同樣的東西,它給出了相同的輸出。 所以我認為這是一個與語言無關的話題。

但為什么會這樣呢?

我的假設是浮點單元對應用程序員舍入之前將“1.4999999999999999999”轉換為“1.5”的額外位進行舍入。

x2 = 1.4999999999999999print(round(x2)) ,有兩個操作會影響該值。 round函數不能直接在數字1.4999999999999999或數字“1.4999999999999999”上操作。 其操作數必須采用Python實現使用的浮點格式。

因此,首先,將1.4999999999999999轉換為浮點格式。 Python對Python實現使用哪種浮點格式並不嚴格,但IEEE-754基本64位二進制格式很常見。 在此格式中,最接近的可表示值為1.4999999999999999為1.5和1.4999999999999997779553950749686919152736663818359375。 前者比后者更接近1.4999999999999999,所以使用前者。

因此,將1.4999999999999999轉換為浮點格式會產生1.5。 然后round(1.5)產生2。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM