溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python中的數(shù)字運(yùn)算及格式化

發(fā)布時(shí)間:2021-08-24 18:58:10 來源:億速云 閱讀:168 作者:chen 欄目:編程語言

本篇內(nèi)容主要講解“Python中的數(shù)字運(yùn)算及格式化”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Python中的數(shù)字運(yùn)算及格式化”吧!

  本篇幅主要針對(duì)浮點(diǎn)數(shù)的一些計(jì)算及格式化輸出。

  round()

  Python 提供的內(nèi)置函數(shù) round(number[, ndigits]) 可用于簡(jiǎn)單的舍入運(yùn)算。如下示例:

  >>> round(1.23)

  1

  >>> round(1.23, 1)

  1.2

  >>> round(1.27, 1)

  1.3

  >>> round(-1.27, 1)

  -1.3

  >>> round(1.2346, 3)

  1.235

  round() 函數(shù)返回四舍五入到小數(shù)點(diǎn)后 ndigits 位精度的數(shù)字。如果 ndigits 默認(rèn)為 None,則返回最接近的整數(shù)。

  ndigits 參數(shù)可以是負(fù)數(shù),在這種情況下,舍入運(yùn)算會(huì)作用在十位、百位、千位等上面。例如:

  >>> x = 1234567

  >>> round(x, -1)

  1234570

  >>> round(x, -2)

  1234600

  >>> round(x, -3)

  1235000

  如果一個(gè)數(shù)字剛好在兩個(gè)邊界中間時(shí),調(diào)用 round() 函數(shù)會(huì)返回離它最近的偶數(shù)。例如 round(0.5) 和 round(-0.5) 返回的結(jié)果都是 0。如下示例:

  >>> round(0.5)

  0

  >>> round(-0.5)

  0

  有時(shí)運(yùn)用 round() 會(huì)得不到期望的值。例如 round(2.675, 2) 得到的是 2.67,卻不是期望得到的 2.68。如下:

  >>> round(2.675, 2)

  2.67

  這并非是 bug。Python 文檔也給出了其中的注解,這是因?yàn)榇蠖鄶?shù)十進(jìn)制小數(shù)實(shí)際上都不能以浮點(diǎn)數(shù)精確地表示。

  Note:The behavior of round() for floats can be surprising: for example, round(2.675, 2) gives 2.67 instead of the expected 2.68. This is not a bug: it’s a result of the fact that most decimal fractions can’t be represented exactly as a float.

  若需了解更多信息可以訪問: Floating Point Arithmetic: Issues and Limitations。

  格式化輸出

  數(shù)字舍入跟格式化不能混淆。若是簡(jiǎn)單輸出指定寬度的數(shù),可以考慮用 format(),不需要使用 round()。在格式化的時(shí)候指定精度就可以。例如:

  >>> x = 1234.56789

  >>> # 精確到小數(shù)點(diǎn)后兩位

  ... format(x, '0.2f')

  '1234.57'

  >>> # 以 10 個(gè)字符右對(duì)齊,精確到小數(shù)點(diǎn) 1 位

  ... format(x, '>10.1f')

  ' 1234.6'

  >>> # 左對(duì)齊

  ... format(x, '<10.1f')

  '1234.6 '

  >>> # 居中

  ... format(x, '^10.1f')

  ' 1234.6 '

  >>> # 包含千分位分隔符

  ... format(x, ',')

  '1,234.56789'

  >>> format(x, '0,.1f')

  '1,234.6'

  >>>

  同樣可以使用指數(shù)記法,將 f 改成 e 或者 E(取決于指數(shù)輸出的大小寫形式)。示例如下:

  >>> format(x, 'e')

  '1.234568e+03'

  >>> format(x, '0.2E')

  '1.23E+03'

  指定寬度和精度的一般形式為 '[<>^]?width[,]?(.digits)?',其中 width 和 digits 為整數(shù),? 代表可選部分。這種格式可以用在字符串的 format() 方法中。示例如下:

  >>> 'The value is {:0,.2f}'.format(x)

  'The value is 1,234.57'

  精確運(yùn)算鄭州較好的婦科醫(yī)院 http://www.kd0371.com/

  因?yàn)楦↑c(diǎn)數(shù)運(yùn)算存在誤差,不建議嘗試使用舍入浮點(diǎn)值來“修正”表面上看起來正確的問題。示例如下:

  >>> a = 2.1

  >>> b = 4.2

  >>> c = a + b

  >>> c

  6.300000000000001

  >>> c = round(c, 2) # 不建議這么做

  >>> c

  6.3

  一般使用浮點(diǎn)數(shù)的情況下,不建議這么做。這些誤差在一般情況下能夠被容忍的。但是如果涉及到比如金融領(lǐng)域(不允許小誤差存在)的情況下,建議考慮使用 decimal 模塊。

  decimal

  由于浮點(diǎn)數(shù)不能精確的表示十進(jìn)制,會(huì)出現(xiàn)上述簡(jiǎn)單數(shù)學(xué)運(yùn)算出現(xiàn)誤差的情況。

  Python 提供的 decimal 模塊,在損耗一定性能的前提下,能夠解決這個(gè)問題。如下示例:

  >>> from decimal import Decimal

  >>> a = Decimal('4.2')

  >>> b = Decimal('2.1')

  >>> a + b

  Decimal('6.3')

  >>> print(a + b)

  6.3

  >>> (a + b) == Decimal('6.3')

  True

  雖然代碼寫起來會(huì)有些奇怪,但是 Decimal 對(duì)象能夠像普通的浮點(diǎn)數(shù)支持所有的常用數(shù)學(xué)運(yùn)算。在使用 print 的情況下,跟普通數(shù)字沒有區(qū)別。

  decimal 允許控制計(jì)算,包括精確位數(shù)跟舍入運(yùn)算??梢酝ㄟ^創(chuàng)建上下文管理器進(jìn)行設(shè)置更改,示例如下:

  >>> from decimal import localcontext

  >>> a = Decimal('1.3')

  >>> b = Decimal('1.7')

  >>> print(a/b)

  0.7647058823529411764705882353

  >>> with localcontext() as ctx:

  ... ctx.prec = 3 # 精確位數(shù)

  ... print(a/b)

  ...

  0.765

  >>> with localcontext() as ctx:

  ... ctx.prec = 50 # 精確位數(shù)

  ... print(a/b)

  ...

  0.76470588235294117647058823529411764705882352941176

  decimal 運(yùn)用場(chǎng)景,更常見的是在金融領(lǐng)域(不能容忍小誤差存在)。

  但是 decimal,需要損耗性能進(jìn)行精確的運(yùn)算,在普通領(lǐng)域,甚至于科學(xué)領(lǐng)域的大多數(shù)運(yùn)算,使用普通浮點(diǎn)數(shù)類型是普遍的做法。

  除了真實(shí)世界很少要求要精確到普通浮點(diǎn)數(shù)能提供的 17 位精度的原因外,還有進(jìn)行大量運(yùn)算的時(shí)候,普通浮點(diǎn)數(shù)要快得多,這同樣是需要衡量的地方。

  但也不能完全忽略誤差,誤差出現(xiàn),同樣需要研究并理解誤差產(chǎn)生的來源。

到此,相信大家對(duì)“Python中的數(shù)字運(yùn)算及格式化”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI