这看起来真的很傻。但我是python的新手,喜欢在我的程序中使用平等条件,并且遇到了一个非常令人惊讶的障碍。虽然这里的实际问题是最后一个条件r==rmax
不满足,但我会错过循环的迭代,但这并不是让我担心的问题。
而不是(琐碎的)解决问题,有人可以解释给我简单来说会发生什么? (无论我运行这个循环多少次,数字结果都是一样的,因此它是系统性的而不是概率性的东西)。 并且确保不会发生这种情况的正确方法(我的意思是正确的是我应该在我的所有编码中采用的编程实践,以便不再发生这种无意的差异)?我的意思是这样的循环是在我的代码中无所不在,这让我很担心。
似乎我不能相信python中的数字,这会使它无法用作计算工具。 PS:我正在和Numpy一起从事科学计算项目。
>>> while r<=r_max:
... print repr(r)
... r = r + r_step
...
2.4
2.5
2.6
2.7
2.8000000000000003
2.9000000000000004
3.0000000000000004
3.1000000000000005
3.2000000000000006
3.3000000000000007
3.400000000000001
3.500000000000001
3.600000000000001
3.700000000000001
3.800000000000001
3.9000000000000012
答案 0 :(得分:1)
简单的答案是,通常在计算中表示的浮点数并不准确,并且您不能将它们视为精确。把它们看作是模糊的;看看他们是否在一定范围内,而不是他们是否等于#34;东西。
数字结果相同,因为它们都具有确定性。每次都以完全相同的方式进行计算。这不是随机错误的情况,而是机器以不精确的方式表示浮点数的情况。
Python有一些确切的数据类型可以使用而不是不精确的浮点数;请参阅decimal
和fractions
模块。
这是一篇经典的文章,名为&#34;每个计算机科学家应该知道的关于浮点算术的内容&#34;谷歌并选择你喜欢的任何链接。
答案 1 :(得分:0)
皮埃尔G.是对的。由于计算机以二进制计算数字,因此无法准确呈现大量的浮点数。但它应该精确,在某些数字取决于您使用的数据类型。
对于你的情况,我想也许你可以使用round(number, digits)
函数得到一个数字然后进行比较。
答案 2 :(得分:0)
这只是浮点运算的问题。实际上如果你知道浮点数在计算机存储器中的表示,那么虽然我们认为是整数,但是某些数字的表示并不存储为整数。它仅以一定的精度(就小数点后的位数而言)存储。无论何时进行数学编程,这个问题都将始终存在。我建议你使用比较,它可以接受公差值。 Numpy有这样的方法,这有利于这种比较。