2015-04-03 76 views
1

我想把所有小数位的1/n都放到Python的列表中。Python中的小数位数

def dec(n): 

    result = float(1)/n 
    while (result >= 1): 
     result = result - 1 

    while (result != 0): 
     result = result * 10 
     decimals = int(result) 
     yield(decimals) 
     result = result - decimals 

然而,当我试图list(dec(3)),它并没有给我一个完整的3S,但列表,而不是像[3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 7, 2]

我应该怎样解决这个问题?

+0

您是否知道一个Python列表不能永远持续下去? – user2357112 2015-04-03 05:15:08

+1

另外请注意,浮点精度是一件事情。在电脑中漂浮像病人 - 你对他们做了太多的操作,他们死了。 (嗯,不是真的,但请阅读http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)如果你想要做无限精确的分割,只需要自己实现这个分叉算法,只使用整数。 – Amadan 2015-04-03 05:17:39

+0

@ user2357112是的,但即使如此,我想要一种方式,我可以得到所有3s,而不是其他数字。我想我需要一些技巧,因为我的代码没有错,但它没有给我预期的结果 – viethaihp291 2015-04-03 05:17:52

回答

3

由于Python浮点数用二进制表示,因此小数部分的浮点表示不仅仅是不精确的 - 十进制近似值通常也是不精确的 - 但是以不直观的方式是不精确的。我们习惯于近似1/3的比例,如0.3333333333或33333333333/10 ** 10(假设10位有效数字)。但是,Python使用的二进制浮点将数字表示为具有2的幂分母的分数。在这种表示中,1/3近似为6004799503160661/2 ** 54,并且输出中的数字来自该分数。

为了计算小数近似分数1/3的数字,导入decimal模块和具有decimal.Decimal(1)替换float(1)Decimal type的设计目标是支持你在这里尝试做的事情,即获得的结果与学校教授算法的铅笔和纸张计算一样。

Decimal实例当然会包含有限数量的数字,这些数字会无限重复1/3。为了能够无限制地访问数字,请导入fractions并使用fractions.Fraction()。在这种情况下,由生成器生成的序列将是无限的,您将无法将其转换为列表,但您仍然可以遍历它并根据需要分析它。

+0

我试过“decimal.Decimal(1)”,但它说“NameError:全局名称'decimal'没有定义” – viethaihp291 2015-04-03 05:25:01

+0

@ viethaihp291您需要在脚本开头附近添加“import decimal”。 (如果你正在使用分数,那么'进口分数'也是一样。)现在我已经更新了答案来提及进口。 – user4815162342 2015-04-03 05:25:44

+0

感谢您的澄清...但似乎“小数”只给出一定的小数位数?当我试图产生30次时,它给我一个迭代错误 – viethaihp291 2015-04-03 05:32:26

0

我假设你使用的是Python 3,因为你只有一个“/”。你会注意到float(1)/ 3 * 100000000 = 33333333.333333332。这可能是由于小数部分的二进制表示变幻莫测,因为在浮点宽度中用完精度位。

所以,你会更好的处理它作为一个字符串,然后转换,为一个列表:

list(str(float(1)/3))[2:] 

['3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3'] 
0

你想表达的合理数量为repeating decimal。而你需要知道:

Every rational number is either a terminating or repeating decimal.

所以你并不需要保存所有的数字有(无重复的部分,重复部分)。另一个重要的一点是,如果你有m/n那么你的重复部分的长度最大为n-1

因为你基本上要求欧拉26项目的解决方案,我不会发布它,而是会给你一个link with some explanation

0

浮点算术必然不准确。准确计算数字的一种方法是使用您可能在学校学到的除法算法。

下面是一个实现:

def dec(n): 
    v = 1 
    while v: 
     v *= 10 
     yield v // n 
     v %= n 

您可以测试它像这样,它显示了1/3,1/5,1/7和1/11第40位。

import itertools 

for i in [3, 5, 7, 11]: 
    print '1/%d = 0.%s' % (i, ''.join(map(str, itertools.islice(dec(i), 40)))) 

输出是:

1/3 = 0.3333333333333333333333333333333333333333 
1/5 = 0.2 
1/7 = 0.1428571428571428571428571428571428571428 
1/11 = 0.0909090909090909090909090909090909090909