当前位置: 首页 > 知识库问答 >
问题:

python十进制。as_integer_ratio()输出

周飞
2023-03-14

在标准库中学习十进制,这似乎是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)

对于1.25工作正常,但是很难相信748723438050345 / 5629499534213121.33的最低分数项,也许133/100可以是更好的输出?

好的,我在使用Decimal('1.33')而不是Decimal(1.33)时得到了回答,那么这是否意味着在使用Decimal()时,最好输入str而不是float

共有2个答案

谯乐池
2023-03-14

你传入的是浮点对象,正是这些对象引入了不精确,你不能用二进制分数表示1和1/3:

>>> format(1.33, '.53')
'1.3300000000000000710542735760100185871124267578125'
>>> (1.33).as_integer_ratio()
(748723438050345, 562949953421312)

而是传入一个字符串:

>>> Decimal('1.33').as_integer_ratio()
(133, 100)

从文件中:

十进制数字可以精确表示。相比之下,像1.12.2这样的数字在二进制浮点中没有精确表示。最终用户通常不会期望1.1 2.2像在二进制浮点中那样显示为3.3000000000000003

如果值是浮点数,则二进制浮点数值将无损地转换为其精确的十进制等效值。这种转换通常需要53位或更多的精度。例如,Decimal('1.1')转换为Decimal('1.100000000000000088817841970012523233890533447265625')

奚修伟
2023-03-14

尝试使用

from decimal import Decimal
print(Decimal('1.25').as_integer_ratio())  # >>> (5, 4)
print(Decimal('1.33').as_integer_ratio())

(5, 4)
(133, 100)

它的标准不同

当你这么做的时候

Decimal(1.25)

Python将我们的文字基10表示转换为浮点对象中的内部基2表示。我们选择的两个值都不能精确地用基数2表示,因此会出现一些舍入。这些四舍五入的浮点值随后被传递给十进制构造函数,并用于构造内部的基数10表示,用于计算。最后,对十进制对象执行该操作。因此,尽管十进制构造函数支持从float转换,但您应该始终将分数十进制文本指定为字符串,以避免创建不精确的中间基2 float对象

为了防止这样的事故请设置

为了避免无意中从浮点构造十进制对象,我们可以修改十进制模块中的信号处理。我们通过在decimal模块上下文的traps属性中将与float操作键关联的值设置为true来实现这一点。有了这个变化,我们试图直接从float构造十进制对象会引发一个FloatOperation异常。

decimal.getcontext().traps[decimal.FloatOperation] = True

例如,对于以下情况,将提出例外

Decimal(0.8) > 0.7

来回答你的问题

Decimal(1.33),这是否意味着在使用Decimal()时,最好输入str而不是float

Python float类型甚至会导致最简单的十进制值出现问题,这在任何需要精确算法的应用程序中都是不可接受的,例如在金融环境中。Decimal类型是一种快速正确舍入的数字类型,用于执行以10为基数的算术运算。关键的是,decimal类型仍然是浮点类型,尽管基数是10而不是2,并且精度有限,但用户可以配置,而不是固定的。使用十进制代替浮点数,比如会计应用程序可以大大减少难以调试的边缘情况。Decimal软件包的创建是为了消除浮动的缺陷。

 类似资料:
  • Python3 实例 以下代码用于实现十进制转二进制、八进制、十六进制: # -*- coding: UTF-8 -*- # Filename : test.py # author by : www.runoob.com # 获取用户输入十进制数 dec = int(input("输入数字:")) print("十进制数为:", dec) print("转换为二进制为:", bin(dec

  • 问题内容: 如何将十进制转换为以下格式的十六进制(至少两位,零填充,没有0x前缀)? 输入: 输出: 输入: 输出: 我尝试过,但似乎它显示了第一个示例,但没有显示第二个示例。 问题答案: 将该功能与格式一起使用。 该部分要求使用至少2位数字,并使用零将其填充到长度,表示小写的十六进制。 的 格式规范的迷你语言 也给你大写十六进制输出,并且可以前缀字段宽度与以包括或前缀(取决于你阉羊使用或作为格式

  • 问题内容: 我这里有一个将十进制转换为十六进制的函数,但它以相反的顺序打印。我该如何解决? 问题答案: 如果要自己编写此代码而不是使用内置函数,则可以在打印当前数字之前简单地进行递归调用:

  • 两周以来,我一直在努力和阅读来解决这个问题,但我尝试的一切都没有奏效:-( 我正在使用python 2.7。 据我所知,我确实有一个base64字符串,格式如下: 我想把它转换成十六进制字符串。00000000194BD636AEDEAE4C9827C9465288D7F40700BA89A9BA12E1314B81606DB385F3B7B100000074656E0000BA89A9BA12E

  • 本文向大家介绍python十进制转二进制的详解,包括了python十进制转二进制的详解的使用技巧和注意事项,需要的朋友参考一下 python十进制转二进制 python中十进制转二进制使用 bin() 函数。 bin() 返回一个整数 int 或者长整数 long int 的二进制表示。 下面是使用示例: 补充:十进制转8进制和16进制的方法: 内容扩展: 以上就是本次介绍的全部相关知识点,感谢大

  • 问题内容: 我有一些Perl代码,其中hex()函数将十六进制数据转换为十进制。如何在Python上执行此操作? 问题答案: 如果用“十六进制数据”表示字符串形式 您可以使用 将其转换为整数并 将其转换为十进制字符串。