我是Python的新手,在尝试使用运算符时,我遇到了这个:
>>> 7.0 / 3
2.3333333333333335
结果不应该是2.3333333333333333或者可能是2.3333333333333334。为什么要以这种方式舍入数字呢?
另外,关于Python 2.7中的地板划分,我的结果是:
>>> 5 / 2
2
>>> 5 // 2
2
>>> 5.0 / 2
2.5
>>> 5.0 // 2
2.0
所以我的观察是,即使在浮点数的情况下,除法也会返回整数商,而正常除法则返回小数值。这是真的吗?
答案 0 :(得分:3)
您的语言没有被破坏,它正在进行浮点数学运算。计算机只能本机存储整数,因此它们需要一些表示十进制数的方法。这种表示有一定程度的不准确性。这就是为什么,通常是.1 + .2!=。3。
答案 1 :(得分:0)
结果应该不是2.3333333333333333还是2.3333333333333334。为什么用这种方式将数字四舍五入?
关键是数字要四舍五入。
第一次舍入是除法运算的一部分,将数字舍入到最接近的双精度浮点值。这是二进制运算,而不是十进制运算。
第二个舍入是将浮点数转换为十进制表示形式以进行显示的一部分。 可能以十进制表示任何二进制分数的确切值,但是通常不希望这样做,因为在大多数应用程序中,这样做只会导致许多位数的错误精度。取而代之的是,Python输出最短的十进制近似值,它将四舍五入到正确的浮点值。
通过使用分数和小数类型,我们可以更好地了解发生了什么,与直接转换为将浮点数转换为分数或小数的字符串将给出准确值不同。我们还可以使用分数类型来确定计算中的误差。
>>> from fractions import Fraction
>>> from decimal import Decimal
>>> 7.0 / 3
2.3333333333333335
>>> Decimal(7.0 / 3)
Decimal('2.333333333333333481363069950020872056484222412109375')
>>> Fraction(7.0 / 3)
Fraction(5254199565265579, 2251799813685248)
>>> Fraction(7,3) - Fraction(7.0 / 3)
分数(-1,6755399441055744)
通过Decimal类型进行的转换向我们显示了浮点数的确切值,并演示了许多错误精度,这通常是由于将浮点值精确转换为小数引起的。
转换为小数也很有趣,分母为2251799813685248,相当于2 51 。这很合理,双精度浮点具有53个有效尾数,对于结果的整数部分,我们需要两个有效位,而对于分数部分,则需要51个有效位。
浮点计算中的错误是1/6755399441055744或⅓* 2 -51 。此错误小于我们2 -51 精度步长的一半,因此答案确实正确地舍入为双精度浮点值。