python脚本中的精度问题

python脚本中的精度问题,python,Python,我需要将数字转换为平面文件格式0.57变成0000000000000000 57,在此格式中(填充零)我的方法 我的方法 def toAmount18(a): return str(int(a*100)).zfill(18) 对于0.57,输出0000000000000000 56 问题在于*100它输出的是56.9999999999,而不是57。想法?使用int()作为默认值就像输入号码上的楼层一样 尝试使用round()方法而不是int(),如示例所示: 您还可以添加一个额外的安全

我需要将数字转换为平面文件格式0.57变成0000000000000000 57,在此格式中(填充零)我的方法

我的方法

def toAmount18(a):
   return str(int(a*100)).zfill(18)
对于0.57,输出0000000000000000 56

问题在于*100它输出的是56.9999999999,而不是57。想法?

使用int()作为默认值就像输入号码上的楼层一样

尝试使用round()方法而不是int(),如示例所示:

您还可以添加一个额外的安全层(try语句),它将处理错误的类型异常。

这是一个问题。在Fortran IV的早期,我们了解到从浮点到整数值的转换是
I=F+.5

在这里,您仍然可以使用相同的技巧:

def toAmount18(a):
   return str(int(a*100 + .5)).zfill(18)
或者使用更现代的工具,如
round

   return str(round(a*100)).zfill(18)
手动方法的优点在于,您可以根据需要指定截断幅度:

  return str(int(a*100 + .00005)).zfill(18)

将仅在小数点后四舍五入。

您可以完全避免使用数学,并邀请正则表达式参加聚会:

re.search(r'\.(\d{,2})', str(0.5)).group(1).zfill(18)
'000000000000000005'

re.search(r'\.(\d{,2})', str(0.57)).group(1).zfill(18)
'000000000000000057'

re.search(r'\.(\d{,2})', str(0.571)).group(1).zfill(18)
'000000000000000057'

re.search(r'\.(\d{,2})', str(0.579)).group(1).zfill(18)
'000000000000000057'

可能需要一些更多的示例输入,以便为预期的输出正确调整此值。

舍入可能会导致不必要的舍入。我们希望int 0579的截断行为在另一端仍应被视为57,如什么你错过了什么?在这种情况下,你可以这样做:1)b=a*100-57,9 2)c=floor(b)-现在你得到了57 3)D=b-c-这里你得到了0,9 4)e=b-D-现在你又得到了57,你可以简化这个操作并用if语句优化它。我试图先将它转换为十进制,但没有用。在c#中没有这个问题。pythons的浮点精度似乎不是最新的:)IEEE浮点对所有语言都是一样的。但也许C#在尾数的最后一部分增加了一些四舍五入的魔力。就我而言,我更喜欢自己决定使用哪种舍入,而不是依赖于语言特性,除非它有明确的文档记录(这是可能的,我不使用C#…)C#符合IEEE标准,即0.57 x 100结果是57。需要调查。@Anders:IEEE没有说明如何将浮点值转换为整数。但是无论使用何种语言
(0.57*100)<57.0
,都是正确的。这在.NET5 0.57x100是56.9999中很有趣,但在net core 3.1中是57。这需要挖掘,他们一定已经移除了5号网中的自动成圆。哦,这是不可能的。谢谢