decimal -- 十进制定点和浮点运算

decimal 模块支持快速正确舍入的十进制浮点运算。

它相对于 float 数据类型提供了几个优点:

十进制“是基于一个浮点模型,它是为人们设计的,并且必须有一个最重要的指导原则 - 计算机必须提供一个算法,与人们在学校学习的算法一样。 - 摘自十进制算术规范。

十进制数可以精确表示。
相反,诸如 1.1 和 2.2 的数字在二进制浮点中没有精确表示。
最终用户通常不会期望 1.1 + 2.2 显示为 3.3000000000000003,因为它与二进制浮点一样。

精确性转化为算术。
在十进制浮点中,0.1 + 0.1 + 0.1 - 0.3 正好等于零。
在二进制浮点中,结果为 5.5511151231257827e-017。
当接近零时,差异阻止可靠的相等测试,并且差异可累积。
因此,在具有严格相等不变量的会计应用程序中,十进制是首选。

十进制模块包含重要位置的概念,因此 1.30 + 1.20 是 2.50 。
尾随零被保留以指示重要性。这是货币应用的习惯表述。
对于乘法,“教科书”方法使用被乘数中的所有数字。
例如,1.3 * 1.2 给出 1.56,而 1.30 * 1.20 给出 1.5600 。

与基于硬件的二进制浮点不同,十进制模块具有用户可改变的精度(默认为28个位置)。
可以与给定问题所需的一样大:

>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')

二进制和十进制浮点都是按照已发布的标准来实现的。
虽然内置浮点类型只暴露其一小部分功能,但十进制模块公开了标准的所有必需部分。
当需要时,程序员可以完全控制舍入和信号处理。
这包括通过使用异常来阻止任何不精确操作来强制执行精确算术的选项。

十进制模块被设计为支持“没有偏见,精确的非舍入十进制运算(有时称为定点运算)和舍入浮点运算。 - 摘自十进制算术规范。

模块设计围绕三个概念:十进制数,算术上下文和信号。

十进制数是不可变的。

它具有符号,系数数字和指数。

为了保留重要性,系数数字不会截断尾随零。

小数还包括特殊值,例如 Infinity,-Infinity 和 NaN 。该标准还区分 -0 与 +0 。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wxlo0.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值