python 中 float 和 decimal 的区别

decimal --- 十进制定点和浮点运算 — Python 3.11.8 文档请参考官方说明文档: decimal --- 十进制定点和浮点运算 — Python 3.11.8 文档

举例:

# 使用 Decimal 类型进行计算
from decimal import Decimal

total_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')))

特点Decimalfloatint
数据类型十进制浮点数二进制浮点数整数
精度高精度,适用于金融计算有限精度,可能会存在精度损失无限精度
精确性提供精确的计算结果可能会存在舍入误差精确,没有小数部分
运算速度比 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_UP

d = 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 = 2

exp = Decimal('0.1') ** decimal_places

# 创建要量化的 Decimal 对象
decimal_object = Decimal('3.14159')

# 根据变量的值动态设置量化精度
quantized_result = decimal_object.quantize(exp)

print(quantized_result)  # 输出: 3.14

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值