// (floordiv) 运算符给出了错误的结果,即使 fraction 是一个浮点数表示的整数
// (floordiv) operator gives wrong result even though fraction is a float-representable integer
def show(x):
return "{:.50f}".format(x)
>>> show((9/50)/(1/50))
'9.00000000000000000000000000000000000000000000000000'
>>> show((9/50)//(1/50))
'8.00000000000000000000000000000000000000000000000000'
为什么会这样?如何实现 floordiv 函数以产生此结果?
这是挂断:
>>> math.fmod(9/50, 1/50)
0.01999999999999999
也就是说,当计算到无限精度时,余数是 而不是 0。请记住,像 1/50
这样的东西在内部表示为十进制值的二进制近似值。 //
和 fmod()
等运算见近似值。
后果:
>>> divmod(9/50, 1/50)
(8.0, 0.01999999999999999)
该元组 (8.0) 的第一部分是 //
returns.
这些是您正在使用的确切值(每个二进制浮点数都可以精确表示为十进制浮点数,但反之亦然):
>>> import decimal
>>> decimal.getcontext().prec = 500
>>> a = decimal.Decimal(9 / 50)
>>> a
Decimal('0.179999999999999993338661852249060757458209991455078125')
>>> b = decimal.Decimal(1 / 50)
>>> b
Decimal('0.0200000000000000004163336342344337026588618755340576171875')
然后你可以看到他们的商非常接近,但严格小于,9:
>>> a / b
Decimal('8.9999999999999994795829572069578825097785927606294264409785130112132181330918190728686667562468053202101562430796913250703133371819349483407279064891778548444542555094951793065257796799431977448531572173096496447578542537338521354220252562619824630430214685714904931305685046145118086722731059777831001898809747580797140817173965632373555310050843739628587610364851425663859425151431557846221951824825835845421021824148219867951326908196293925437792528353996177649543157087221511093517505990964829850')
所以//
returns 8. 余数是:
>>> a - 8*b
Decimal('0.0199999999999999900079927783735911361873149871826171875000')
>>> float(_)
0.01999999999999999
如果您在处理概念性十进制数时不能忍受这样浅薄的惊喜,请改用 decimal
模块。二进制浮点数的本质不会改变 ;-)
请检查此线程,使用浮点数作为楼层划分的输入应该以一种有点棘手的方式完成
def show(x):
return "{:.50f}".format(x)
>>> show((9/50)/(1/50))
'9.00000000000000000000000000000000000000000000000000'
>>> show((9/50)//(1/50))
'8.00000000000000000000000000000000000000000000000000'
为什么会这样?如何实现 floordiv 函数以产生此结果?
这是挂断:
>>> math.fmod(9/50, 1/50)
0.01999999999999999
也就是说,当计算到无限精度时,余数是 而不是 0。请记住,像 1/50
这样的东西在内部表示为十进制值的二进制近似值。 //
和 fmod()
等运算见近似值。
后果:
>>> divmod(9/50, 1/50)
(8.0, 0.01999999999999999)
该元组 (8.0) 的第一部分是 //
returns.
这些是您正在使用的确切值(每个二进制浮点数都可以精确表示为十进制浮点数,但反之亦然):
>>> import decimal
>>> decimal.getcontext().prec = 500
>>> a = decimal.Decimal(9 / 50)
>>> a
Decimal('0.179999999999999993338661852249060757458209991455078125')
>>> b = decimal.Decimal(1 / 50)
>>> b
Decimal('0.0200000000000000004163336342344337026588618755340576171875')
然后你可以看到他们的商非常接近,但严格小于,9:
>>> a / b
Decimal('8.9999999999999994795829572069578825097785927606294264409785130112132181330918190728686667562468053202101562430796913250703133371819349483407279064891778548444542555094951793065257796799431977448531572173096496447578542537338521354220252562619824630430214685714904931305685046145118086722731059777831001898809747580797140817173965632373555310050843739628587610364851425663859425151431557846221951824825835845421021824148219867951326908196293925437792528353996177649543157087221511093517505990964829850')
所以//
returns 8. 余数是:
>>> a - 8*b
Decimal('0.0199999999999999900079927783735911361873149871826171875000')
>>> float(_)
0.01999999999999999
如果您在处理概念性十进制数时不能忍受这样浅薄的惊喜,请改用 decimal
模块。二进制浮点数的本质不会改变 ;-)
请检查此线程,使用浮点数作为楼层划分的输入应该以一种有点棘手的方式完成