Cod*_*755 2 decimal fractions python-3.x
学习标准库中的Decimal,这似乎是python 3.6中的新函数:
as_integer_ratio()
返回一对 (n, d) 整数,这些整数将给定的 Decimal 实例表示为分数、最低项和正分母
所以我尝试了一下:
print(Decimal(1.25).as_integer_ratio()) # >>> (5, 4)
print(Decimal(1.33).as_integer_ratio()) # >>> (748723438050345, 562949953421312)
Run Code Online (Sandbox Code Playgroud)
对于 工作正常1.25,但很难相信这748723438050345 / 562949953421312是 的最低分数项1.33,也许133/100可能是更好的输出?
好的,我得到了使用Decimal('1.33')other not 的答复Decimal(1.33),那么这是否意味着在使用 Decimal() 时首选输入str以外的内容float?
尝试使用
from decimal import Decimal
print(Decimal('1.25').as_integer_ratio()) # >>> (5, 4)
print(Decimal('1.33').as_integer_ratio())
(5, 4)
(133, 100)
Run Code Online (Sandbox Code Playgroud)
其标准的差异
当你这样做时
Decimal(1.25)
Run Code Online (Sandbox Code Playgroud)
Python 将我们的字面基数 10 表示形式转换为浮点对象内的内部基数 2 表示形式。我们选择的两个值都不能用基数 2 精确表示,因此会发生一些舍入。然后,这些舍入的浮点值会传递给十进制构造函数,并用于构造内部以 10 为基数的表示形式,该表示形式将用于计算。最后对小数对象进行运算。因此,尽管十进制构造函数支持从浮点数转换,但您应该始终将小数十进制文字指定为字符串,以避免创建不精确的中间基数为 2 的浮点数对象
为防止此类事故发生,请设置
为了避免无意中从浮点数构造十进制对象,我们可以修改十进制模块中的信号处理。我们通过将十进制模块上下文的 traps 属性中与 float 操作键关联的值设置为 true 来实现此目的。进行此更改后,我们尝试直接从浮点数构造十进制对象会引发 FloatOperation 异常。
decimal.getcontext().traps[decimal.FloatOperation] = True
Run Code Online (Sandbox Code Playgroud)
例如,对于以下情况将引发异常
Decimal(0.8) > 0.7
Run Code Online (Sandbox Code Playgroud)
回答你的问题
Decimal(1.33),这是否意味着使用 Decimal() 时优先输入 str 而不是 float
即使是最简单的十进制值,Python 浮点类型也会导致问题,这在任何需要精确算术的应用程序(例如金融环境)中都是不可接受的。Decimal 类型是一种快速正确舍入的数字类型,用于以 10 为基数执行算术。至关重要的是,小数类型仍然是浮点类型,尽管其基数为 10 而不是 2,并且精度有限,但用户可以配置而不是固定。例如,在会计应用程序中使用小数代替浮点数可以显着减少难以调试的边缘情况。创建 Decimal 包是为了消除浮动的缺陷。
| 归档时间: |
|
| 查看次数: |
2179 次 |
| 最近记录: |