【python】python 数学相关模块——math/decimal模块


python数学模块

一, math模块

math库是python提供的内置数学类函数库,math库不支持复数类型,仅支持整数和浮点数运算。

1. math库数学常数

常数说明实例
math.pi圆周率Πmath.pi输出结果:3.141592653589793
math.e自然常数emath.e输出结果:2.718281828459045
math.inf正无穷大,
-math.inf是负无穷大
math.inf输出 inf
math.nan非浮点数标记,NaNmath.nan输出结果:nan

2. math库常用函数

函数名说明
math.ceil(f)向上取整,返回值:整数值
math.floor(f)向下取整,返回值:整数
round(f)四舍五入,返回值:整数
math.fabs(f)获取绝对值操作,返回值:浮点数
abs(num)获取绝对值操作,返回值:根据传入的参数而定
math.fmod(x,y)返回x/y的余数,返回值:浮点数
math.pow(x,n)返回x的n次方,返回值:浮点型
math.sqrt(num)对num开平方,返回值:浮点数
fsum(seq)返回序列中所有元素的和,返回值:浮点数
sum(seq)将一个序列的数值进行相加求和,返回值:根据序列中数值的类型变化
math.modf(num)将一个浮点数拆成小数和整数部分组成的元组,返回值:元组
math.trunc(f)返回浮点数的整数部分,返回值:整数
math.copysign(n1,n1)将第二个数的正负号赋值给第一个数,返回值:浮点数
math.factorial(x)返回x的阶乘,如果x不是整数或为负数将引发ValueError,返回值:整数
math.gcd(x,y)返回整数x和y的最大公约数,返回值:整数

3.math库使用示例

# -*- coding: utf-8 -*-
import math

# math库常用变量
print("math.pi = ", math.pi)
print('math.e = ', math.e)
print('math.inf = ', math.inf)
print('math.nan = ', math.nan)


# math库常用函数

print('math.ceil()向上取整,math.ceil(2.3) = ', math.ceil(2.3))
print('math.ceil()向上取整,math.ceil(2.5) = ', math.ceil(2.5))
print('math.ceil()向上取整,math.ceil(2.0) = ', math.ceil(2.0))
print('math.ceil()向上取整,math.ceil(2.8) = ', math.ceil(2.8))
print('math.ceil()向上取整,math.ceil(-2.8) = ', math.ceil(-2.8))

print('math.floor()向下取整,math.floor(2.3) = ', math.floor(2.3))
print('math.floor()向下取整,math.floor(2.5) = ', math.floor(2.5))
print('math.floor()向下取整,math.floor(2.0) = ', math.floor(2.0))
print('math.floor()向下取整,math.floor(2.8) = ', math.floor(2.8))
print('math.floor()向下取整,math.floor(-2.8) = ', math.floor(-2.8))

print('round()四舍五入,round(2.3) = ', round(2.3))
print('round()四舍五入,roundr(2.5) = ', round(2.5))
print('round()四舍五入,round(2.0) = ', round(2.0))
print('round()四舍五入,round(2.8) = ', round(2.8))
print('round()四舍五入,round(-2.8) = ', round(-2.8))

print('math.fabs()获取绝对值,math.fabs(2.3) = ', math.fabs(2.3))
print('math.fabs()获取绝对值,math.fabs(-2.3) = ', math.fabs(-2.3))
print('math.fabs()获取绝对值,math.fabs(-2.0) = ', math.fabs(-2.0))
print('math.fabs()获取绝对值,math.fabs(-2) = ', math.fabs(-2))

print('abs()获取绝对值,abs(2.3) = ', abs(2.3))
print('abs()获取绝对值,abs(-2.3) = ', abs(-2.3))
print('abs()获取绝对值,abs(-2.0) = ', abs(-2.0))
print('abs()获取绝对值,abs(-2) = ', abs(-2))

print('math.fmod(x,y)获取x/y的余数,math.fmod(2,3) = ' ,math.fmod(2,3))
print('math.pow(x,y)获取x的n次方,math.pow(2,3) = ', math.pow(2,3))
print('math.sqrt()获取开放根,math.sqrt(4) = ', math.sqrt(4))
print('fsum()获取序列中所有元素的和,fsum([1,2,3,4,5,6]) = ', math.fsum([1,2,3,4,5,6]))
print('sum()获取序列中所有元素的和,sum([1,2,3,4,5,6]) = ', sum([1,2,3,4,5,6]))
print('math.modf()获取浮点数的小数和整数部分,math.modf(2.3) = ', math.modf(2.3))
print('math.trunc()获取浮点数的整数部分,math.trunc(2.3) = ', math.trunc(2.3))
print('math.copysign(n1,n2)把第二个数的正负号赋值给第一个浮点数,math.copysign(-2.3,1) = ', math.copysign(-2.3,1))
print('math.copysign(n1,n2)把第二个数的正负号赋值给第一个浮点数,math.copysign(2.3,-1) = ', math.copysign(2.3,-1))
print('math.gcd(x,y)获取x和y的最大公约数,math.gcd(16,24) = ', math.gcd(16,24))

try:
    print('math.factorial()获取阶乘,math.factorial(3) = ', math.factorial(3))
    print('math.factorial()获取阶乘,math.factorial(2.3) = ', math.factorial(2.3))
    print('math.factorial()获取阶乘,math.factorial(-2) = ', math.factorial(-2))
except ValueError as e:
    print(e)
finally:
    pass

二, decimal模块

decimal模块提供了一个Decimal数据类型用于浮点数计算。相比内置的二进制浮点数实现float,Decimal有助于金融应用和其它需要精确十进制表达的场合,控制精度,控制舍入以适应法律或者规定要求,确保十进制数位精度,或者用户希望计算结果与手算相符的场合。
Decimal重现了手工的数学运算,确保了二进制浮点数无法精确保有的数据精度。高精度使Decimal可以执行二进制浮点数无法进行的模运算和等值测试。

1. 什么时候使用decimal

python中小数相加可能计算结果不对,是由于科学计算精度问题,如果需要处理这个问题就需要用到decimal模块。

2. 使用decimal

  • 设置精度:decimal.getcontext().prec = num,num为有效数字个数

  • 设置小数位数:quantize()

注意:decimal.getcontext().prec 和 quantize()不能同时使用,如果同时使用会提示错误:decimal.InvalidOperation: [<class ‘decimal.InvalidOperation’>]

3. decimal使用示例

# -*- coding: utf-8 -*-
import decimal

"""
decimal.getcontext().prec = 3  # 设置有效数字是3位
print(decimal.Decimal(2.32) + decimal.Decimal(3.01))

decimal.getcontext().prec = 2  # 设置有效数字是2位
print(decimal.Decimal(2.32) + decimal.Decimal(3.01))
"""

# quantize()设置小数位数
num = decimal.Decimal(1.23456789).quantize(decimal.Decimal('0.000'))
print(num)

文章参考:https://blog.csdn.net/yuan2019035055/article/details/124034026

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简易的发红包抢红包的Python程序,使用了`random`、`time`、`math`、`decimal`和`collections`这五个模块。 ```python import random import time import math import decimal import collections def send_red_packet(total_amount, num): """ 发红包函数,total_amount为总金额,num为红包个数 """ if total_amount < num * 0.01: raise ValueError('红包金额太少,无法分给这么多人') amount_list = [] remain_amount = total_amount remain_num = num for i in range(num - 1): min_amount = decimal.Decimal('0.01') max_amount = decimal.Decimal(remain_amount - remain_num * min_amount) amount = random.uniform(min_amount, max_amount) amount = round(amount, 2) amount_list.append(amount) remain_amount -= amount remain_num -= 1 amount_list.append(round(remain_amount, 2)) random.shuffle(amount_list) return amount_list def grab_red_packet(red_packet_list): """ 抢红包函数,red_packet_list为红包金额列表 """ if not red_packet_list: raise ValueError('红包已被抢完') red_packet = red_packet_list.pop(0) return red_packet if __name__ == '__main__': total_amount = decimal.Decimal('10') num = 5 red_packet_list = send_red_packet(total_amount, num) print('发出的红包金额为:', red_packet_list) red_packet_dict = collections.defaultdict(decimal.Decimal) for i in range(num): red_packet = grab_red_packet(red_packet_list) print('第{}个人抢到了{}元的红包'.format(i + 1, red_packet)) red_packet_dict[i + 1] += red_packet print('抢红包的结果为:', red_packet_dict) ``` 以上代码中,`send_red_packet`函数用于发红包,它接受两个参数:`total_amount`为总金额,`num`为红包个数。函数内部使用了随机数生成算法来随机生成每个红包的金额,保证每个红包的金额都在0.01元到剩余金额平均值的两倍之间。最后将生成的红包金额列表随机打乱后返回。 `grab_red_packet`函数用于抢红包,它接受一个参数:`red_packet_list`为红包金额列表。函数内部弹出红包金额列表中的第一个元素作为抢到的红包金额,并返回。 在主程序中,我们先使用`send_red_packet`函数生成红包金额列表,然后使用`grab_red_packet`函数模拟多个人抢红包的过程,最后将每个人抢到的红包金额统计起来输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值