数值类型
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
- 内置模块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)
标签:Python,Decimal,random,数值,浮点数,Fraction,类型,decimal,小数 From: https://www.cnblogs.com/N1rv2na/p/18051536尽管可以把浮点数转换成分数,但是某种情况下,这么做会有不可避免的精度损失,因为这个数字在其最初的浮点数形式下就是不精确的,必要时,可以通过限制分母的最大值来简化这样的结果。
>>> (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)