Python-数值类型

数值类型

1. 内置数值工具

  • 内置数学函数:
    • pow:计算幂
    • abs:计算绝对值
    • sum:求和
    • round:向上取整(四舍五入)
    • max:求最大值
    • min:求最小值
>>> pow(2, 4), 2 ** 4, 2.0 ** 4.0
(16, 16, 16.0)

>>> abs(-42.0), sum((1, 2, 3, 4))
(42.0, 10)

>>> min((1, 2, 3, 4)), max((1, 2, 3, 4))
(1, 4)

>>> round(2.56), round(2.46), round(2.567, 2)  # round和floor还可以指定小数的舍入位数
(3, 2, 2.57)
>>> '%.1f' % 2.567, '{0:.2f}'.format(2.567)  # 字符串格式化也可使小数按位舍入
('2.6', '2.57')

内置函数位于一个隐藏的命名空间内,python会自动在这个命名空间中搜索名字,这个命名空间对应builtins的标准库模块。

  • 内置模块math:
>>> import math
>>> math.pi, math.e
(3.141592653589793, 2.718281828459045)

>>> math.sin(math.pi / 3), math.cos(math.pi / 3), math.tan(math.pi / 3)
(0.8660254037844386, 0.5000000000000001, 1.7320508075688767)

>>> math.sqrt(2)
1.4142135623730951

>>> math.floor(2.56), math.floor(-2.56)  # 向下取整
(2, -3)
>>> math.trunc(2.56), math.trunc(-2.56)  # 截断小数部分
(2, -2)
  • 内置模块random

random提供了一系列的随机处理函数工具:

random.random函数:返回一个随机的0到1之间的浮点数

random.randint函数:返回一个两个数字之间的随机整数

random.choice函数:从一个序列中随机挑选一项

random.shuffle函数:随机打乱列表中的元素

>>> import random
>>> random.random()
0.6190454094520157
>>> random.random()
0.88053113013268

>>> random.randint(1, 10)
9
>>> random.randint(1, 10)
1

>>> random.choice(['a', 'b', 'c'])
'c'
>>> random.choice(['a', 'b', 'c'])
'b'

>>> abc = [ 'a', 'b', 'c']
>>> random.shuffle(abc)
>>> abc
['b', 'c', 'a']
>>> random.shuffle(abc)
>>> abc
['a', 'b', 'c']

2. 小数类型

python中还有一种小数对象(Decimal),小数对象位于decimal模块中,创建时需要调用decimal模块的Decimal构造函数来创建小数,而不是通过字面量表达式来创建。

小数很像浮点数,但是小数有固定的位数和小数点,即小数是精度固定的浮点数

小数基础知识

浮点数的运算缺乏精确性:

>>> 0.1 + 0.1 + 0.1 - 0.3
5.551115123125783e-17

使用小数对象将使结果更加准确:

>>> from decimal import Decimal
>>> Decimal('0.1') + Decimal('0.1') + Decimal('0.1') - Decimal('0.3')
Decimal('0.0')

在表达式中使用不同精度的小数时,python会自动转换为最高的小数精度:

>>> Decimal('0.1') + Decimal('0.10') + Decimal('0.10') - Decimal('0.3')
Decimal('0.00')

也可以使用浮点数来创建小数对象,这一转换是精确的,但是有时候结果会产生庞大的小数位数:

Decimal(0.1) + Decimal(0.1) + Decimal(0.1) - Decimal(0.3)
Decimal('2.775557561565156540423631668E-17')

设置全局小数精度

decimal模块还可设置全局的小数数值精度和舍入模式等:

>>> import decimal
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.1428571428571428571428571429')  # 小数的默认有效精度是28

# 设置小数精度
>>> decimal.getcontext().prec = 4  
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.1429')

# 设置舍入模式,decimal.ROUND_HALF_UP表示向上舍入,decimal.ROUND_HALF_DOWN表示向下舍入
>>> decimal.getcontext().rounding = decimal.ROUND_HALF_UP
>>> Decimal('3') / Decimal('2.2')
Decimal('1.364')

小数上下文管理器

可以使用with上下文管理语句创建小数的上下文管理器,这样在with语句中设置的精度将会在退出with语句后重置:

# 创建上下文管理器
>>> with decimal.localcontext() as ctx:
        ctx.prec = 2
        decimal.Decimal(1) / decimal.Decimal(7)

    
Decimal('0.14')
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.1429')

3. 分数类型

python中还有分数类型(Fraction),它实现了一个有理数对象,它显式地保留了一个分子和分母,从而避免了浮点数运算的不精确性。

分数基础知识

与小数类型类似,分数类型位于fractions模块中,需要导入fractions模块的构造函数Fraction并传递一个分子和分母来产生一个分数:

>>> from fractions import Fraction
>>> Fraction(1, 3)
Fraction(1, 3)
>>> Fraction(4, 6)
Fraction(2, 3)
>>> x = Fraction(1, 3)
>>> y = Fraction(4, 6)  # 分数会自动约分
>>> x
Fraction(1, 3)
>>> y
Fraction(2, 3)
>>> print(y)
2/3

分数对象也可以通过浮点数字符串来创建:

>>> Fraction('.25')
Fraction(1, 4)

>>> Fraction('1.25')
Fraction(5, 4)

一旦创建了分数对象,就可以用于平常的数学表达式中:

>>> x + y
Fraction(1, 1)
>>> x - y
Fraction(-1, 3)
>>> x * y
Fraction(2, 9)

分数转换和混用类型

  • 浮点数转分数:浮点数对象有一个as_integer_ratio()方法,可以产生分子分母比;另外,分数有一个from_float方法,可以接受一个浮点数返回对应的分数
>>> f = 0.25
>>> z = Fraction(*f.as_integer_ratio())  # *号是一种特殊的语法,它可以把一个元组展开成单独的参数
>>> z
Fraction(1, 4)
>>> Fraction.from_float(0.75)
Fraction(3, 4)
  • 分数转浮点数:float函数可以直接将Fraction对象转换成浮点数
>>> z
Fraction(1, 4)
>>> float(z)
0.25

表达式中允许分数和浮点数混合使用:

>>> x
Fraction(1, 3)
>>> x + 2               # Fraction + int -> Fraction
Fraction(7, 3)
>>> x + 2.0             # Fraction + float -> float
2.3333333333333335
>>> x + (1./3)
0.6666666666666666
>>> x + (4./3)
1.6666666666666665
>>> x + Fraction(4, 3)  # Fraction + Fraction -> Fraction
Fraction(5, 3)

尽管可以把浮点数转换成分数,但是某种情况下,这么做会有不可避免的精度损失,因为这个数字在其最初的浮点数形式下就是不精确的,必要时,可以通过限制分母的最大值来简化这样的结果。

>>> (4 / 3).as_integer_ratio()
(6004799503160661, 4503599627370496)

>>> x
Fraction(1, 3)
>>> a = x + Fraction(*(4 / 3).as_integer_ratio())
>>> a
Fraction(22517998136852479, 13510798882111488)
>>> 22517998136852479 / 13510798882111488
1.6666666666666665
>>> a.limit_denominator(10)
Fraction(5, 3)
posted @   N1rv2na  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示