ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

在Python中浮动到分数转换

2019-08-24 03:07:23  阅读:281  来源: 互联网

标签:fractions python floating-point type-conversion


Python 3.52中对float类型到Fraction类型转换的主题进行练习时,我发现了两种不同转换方式之间的区别.

第一种方法是:

>>> from fractions import Fraction
>>> x = 1232.23
>>> f = Fraction(*x.as_integer_ratio())
>>> print(f)
2709702426188841/2199023255552      #Answer

第二种方法是:

>>> from fractions import Fraction
>>> x = 1232.23
>>> f = Fraction(str(x))
>>> print(f)
123223/100                          #Answer

我想知道这两个不同答案背后的原因?很抱歉,如果这是一个愚蠢的问题,我是编程和Python的新手.

编辑:我找到了一种方法,通过limit_denominator方法将第一种方法获得的不准确分数转换为精确分数:

>>> from fractions import Fraction
>>> x = 1232.23
>>> f = Fraction(*x.as_integer_ratio())
>>> f = f.limit_denominator(100)     
>>> print(f)
123223/100

解决方法:

又是因为浮点数不存储在base-10(十进制)中,而是存储在base-2(二进制)中.

在base-10中有限长度的数字可能是base-2中的重复小数.并且因为浮点数是固定大小,重复小数会被截断,导致不准确.

当你使用as_integer_ratio作为base-2中重复小数的数字时,由于base-10到base-2转换中的轻微不准确,你会得到一些有点愚蠢的分数.如果将这两个数字分开,则该值将非常接近原始数字.

例如,虽然1/10 = 0.1 in base-10并且不是重复小数,但它实际上是base-2中的重复小数.就像基数10中的1/3 = 0.333 …一样.

>>> (0.1).as_integer_ratio()
(3602879701896397, 36028797018963968)

如果Python的输出是精确的,即使你在提示符中输入0.1,你也会看到这一点,通过获得类似于1.00000 … 01的输出.但是Python在一般情况下会隐藏这种不准确性,导致混淆.

标签:fractions,python,floating-point,type-conversion
来源: https://codeday.me/bug/20190824/1704026.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有