2014-10-27 50 views
1

上漂浮狀態什麼規則規定Python如何浮動四捨五入?

0.1

0.1000000000000000055511151231257827021181583404541015625

也就是說更多的數字比大多數人覺得有用,所以Python保持 位數管理通過顯示一個圓形的值,而不是

Python文檔

0.1

圍繞哪些花車四捨五入展示哪些規則,哪些不規範?我遇到一些有趣的場景中

1.1 + 2.2返回3.3000000000000003(未四捨五入)

1.0 + 2.3回報3.3(四捨五入)

我知道小數模塊存在使這些事情是一致的,但是對於什麼決定了浮游物中顯示的四捨五入感到好奇。

+4

規則會根據您使用的Python版本而變化。看例如http://stackoverflow.com/questions/25898733/why-does-strfloat-return-more-digits-in-python-3-than-python-2 – 2014-10-27 16:57:34

+0

@MarkRansom考慮到那裏有一個特別好的答案,我不知道是否認爲這個問題是重複的,或者試圖做出更加實際的回答。 – 2014-10-27 17:06:47

+1

@PascalCuoq我得到了這樣一個嘮叨的感覺,那裏的答案並不完整。它當然不是一種易於消化的格式。 – 2014-10-27 17:12:10

回答

3

什麼是圍繞哪些花車四捨五入顯示 哪些規則沒有?我遇到一些有趣的場景中

1.1 + 2.2返回3.3000000000000003(未四捨五入)

1.0 + 2.3回報3.3(四捨五入)

部分的解釋當然是1.1 + 2.2和1.0 + 2.3產生不同的浮點數,並且的部分解釋是是1.1不是真的11/10,2.2不是真的22/10,當然浮點數+也不是RA也可以添加。

許多現代編程語言,包括最近的Python的變化,顯示一個雙精度浮點值d時,顯示必要的十進制表示,重新分析double的十進制數字準確數量,再次轉換爲d。因此:

  1. 只有一個浮點值打印爲3.3。不能有兩個,因爲它們必須通過定義的應用是相同的,並且至少有一個,因爲如果將十進制表示3.3轉換爲double,則會得到一個double,它具有生成字符串「 3.3「轉換爲十進制時所用的算法。

  2. 這些值爲了顯示十進制數字而四捨五入,但它們保持原來的數字。因此,您所要求的一些「規則」是關於如何對浮點運算進行舍入的規則。這很簡單,但你必須look at the binary representation of the arguments and results,它很簡單。如果您查看小數表示,舍入看起來是隨機的(但它不是)。

  3. 這些數字在二進制中只有一個緊湊的表示形式。確切的值可能需要很多十進制數字來表示。 「3.3000000000000003」不是「未被佔用」,它只是四捨五入到比「3.3」更多的數字,具體地說,恰好是將該雙精度數字與其鄰居區分開所需的位數(由「3.3」 )。它們分別是,其實下面的數字:

 
3.29999999999999982236431605997495353221893310546875 
3.300000000000000266453525910037569701671600341796875 

在這兩個,33/10是與其最接近的,所以前者可打印爲「3.3」。後者不能打印爲「3.3」,也不能打印爲「3.30」,「3.300」,...,「3.300000000000000」,因爲所有這些表示都是等效的,並且回到浮點數3.29999999999999982236431605997499353221893310546875。所以必須打印爲「3.3000000000000003」,其中3是因爲數字2後面是6而獲得的。