以下是逐行细分:
def intF(n, d, l=40):
很明显。n
是一个数字,d
是另一个数字(除数),l
是小数点后要打印的位数。
s=str(n*10**l / d)
这有点不寻常。这不是依赖浮点运算,而是乘以n
,10 ** l
即乘以 a1
后跟l
数字。这样最终结果不会有任何浮点错误——假设d
总是一个整数。(当然,任何剩余的数字都会被截断。另外,在 Python 3 中替换/
为//
以获得相同的行为。)
此时,s
将是一个整数的字符串表示形式——再次假设是一个整数d
——但它将与. 所以现在我们只需要在正确的位置插入小数点。float(n) / d
if len(s) < l:
return '0.{:0>{width}}'.format(s,width=l)
如果 的长度s
小于l
,那么我们需要填充它并在前面加上0.
。这就是这样做的。该{:0>{width}}
字段表示要创建一个宽度为零的填充字段,并在右侧 ( ) 侧width
插入一个值。>
然后s
通过 via 传入format
,我们得到了结果。
if len(s) > l:
return s[0:len(s)-l]+'.'+s[len(s)-l:]
如果 的长度a
大于l
,那么我们需要在正确的位置插入小数点。这就是这样做的。它从 中删除尾随l
数字s
,附加 a .
,然后附加剩余的l
数字。
return '0.'+s
最后一种可能性是s
正好是l
数字长。在这种情况下,我们不需要做任何填充;我们可以在前面加上0
一个小数点。
最后一点:如果您向此函数传递除整数以外的任何内容,它将无法按预期工作。考虑一下:
>>> intF(10, 10.1, 10)
'990.0990099.01'
或这个:
>>> intF(10.1, 10, 10)
'101.00000000.0'