decimal --- 十进制定点和浮点运算 — Python 3.11.8 文档请参考官方说明文档: decimal --- 十进制定点和浮点运算 — Python 3.11.8 文档
举例:
# 使用 Decimal 类型进行计算
from decimal import Decimaltotal_float = 0.1 + 0.2
total_decimal = Decimal('0.1') + Decimal('0.2')
print("[0.1 + 0.2] 使用 float 类型进行计算:", total_float) # 输出可能是 0.30000000000000004,而不是期望的 0.3
print("[0.1 + 0.2] 使用 Decimal 类型进行计算:", total_decimal)
print()
print("[1.23 ÷ 0.1] 使用 float 类型进行计算:", (1.23 / 0.1) ) # 输出可能是 12.299999999999999 而不是期望的 12.3
print("[1.23 ÷ 0.1] 使用 Decimal 类型进行计算:", Decimal('1.23') / Decimal('0.1'))
print("[1.23 ÷ 0.1] 使用 float ->转成-> Decimal 类型进行计算:", Decimal(1.23) / Decimal(0.1))
print()
print("[1.23 + 0.1] 使用 float 类型进行计算:", (1.23 + 0.1)) # 这个可以正常输出1.33,
print("[1.23 + 0.1] 使用 Decimal 类型进行计算:", (Decimal('1.23')+Decimal('0.1')))
特点 | Decimal | float | int |
---|---|---|---|
数据类型 | 十进制浮点数 | 二进制浮点数 | 整数 |
精度 | 高精度,适用于金融计算 | 有限精度,可能会存在精度损失 | 无限精度 |
精确性 | 提供精确的计算结果 | 可能会存在舍入误差 | 精确,没有小数部分 |
运算速度 | 比 float 类型稍慢 | 比 Decimal 类型稍快 | 最快 |
内存消耗 | 比 float 类型稍大 | 比 Decimal 类型稍小 | 最小 |
使用情景 | 金融应用、精确计算 | 科学计算、数据分析 | 计数、索引和简单运算 |
Decimal('0.1') 跟 Decimal(0.1) 等效吗?
答:
不完全等效。
Decimal('0.1')
:使用字符串表示的十进制数,可以确保精确地创建 Decimal 对象,因为字符串会被解析为准确的数字。Decimal(0.1)
:使用浮点数表示的十进制数,由于浮点数本身可能存在精度损失,因此在创建 Decimal 对象时,可能会出现精度损失或不精确的情况。
因此,推荐使用字符串表示法 Decimal('0.1')
来确保精确性。
注意:上下文精度和舍入仅在算术运算期间发挥作用。 getcontext().prec getcontext().rounding
getcontext().prec = 6
a = Decimal('3.0') # 没有发生影响,精度还是1位小数b = Decimal('3.1415926535') # 没有发生影响,精度还是10位小数c = Decimal('3.1415926535') + Decimal('2.7182818285') # 发生影响了,结果是 Decimal('5.85987')getcontext().rounding = ROUND_UPd = Decimal('3.1415926535') + Decimal('2.7182818285') # 结果是 Decimal('5.85988')
quantize() 用法:
decimal_object.quantize(exp, rounding=None, context=None)
参数说明
quantize
方法接受一个 Decimal
对象作为exp参数,表示将要量化到的精度。这个参数取值通常是Decimal('0.1')、Decimal('0.01')、Decimal('0.001')、Decimal('0.0001')(但我把这个参数取值为Decimal('1.2'),Decimal('13.55'),Decimal('0.335') 得到的效果是一样的,具体区别是什么,我不知道,未查清楚之前,还是老老实实用0.0001这种形式吧)
-
exp
:这个参数是一个 Decimal 对象,表示将要量化到的精度。也可以是一个整数,表示量化到小数点后的位数。 -
rounding
:可选参数,用于指定舍入规则。如果不提供该参数,则使用 Decimal 对象的上下文中指定的默认舍入规则。可选的取值有decimal.ROUND_CEILING
,decimal.ROUND_DOWN
,decimal.ROUND_FLOOR
,decimal.ROUND_HALF_DOWN
,decimal.ROUND_HALF_EVEN
,decimal.ROUND_HALF_UP
,decimal.ROUND_UP
, 和decimal.ROUND_05UP
。 -
context
:可选参数,用于指定 Decimal 操作的上下文环境。如果不提供该参数,则使用当前默认的上下文环境。
from decimal import Decimal# 小数位数作为变量
decimal_places = 2exp = Decimal('0.1') ** decimal_places# 创建要量化的 Decimal 对象
decimal_object = Decimal('3.14159')# 根据变量的值动态设置量化精度
quantized_result = decimal_object.quantize(exp)print(quantized_result) # 输出: 3.14