四舍五入浮动,并带有表示错误,直到最接近和正确的结果


问题内容

我遇到的情况是Python中的经典表示错误开始成为问题:我需要将它们用于Numpy中的Matrix运算,并且尚不支持 十进制 类型。

你们都知道,如果我111.85 * 111.85会得到,12510.422499999999但是如果round(12510.422499999999, 4)我能得到适当的结果,那当然是可以的12510.4225

但是实际的问题是:

  • 这回合是个好主意和好的做法吗?
  • 这适用于所有情况吗?有时小数点位置..999小数点可能会更多
  • 最后,如何为所有可能的值获取适当的小数位数以与舍入配合使用?

问题答案:

即使将数字四舍五入,小数点仍然不会 完全 符合您的期望。Python可能只显示最高有效位,但是潜在的十进制不准确度仍然存在。

python文档专门为它提供了一部分

由于显示值的方式,许多用户不了解近似值。Python仅将十进制近似值打印到机器存储的二进制近似值的真实十进制值。在大多数机器上,如果Python要打印存储为0.1的二进制近似值的真实十进制值,则必须显示

>>> 0.1
0.1000000000000000055511151231257827021181583404541015625

这比大多数人认为有用的数字还要多,因此Python通过显示舍入的值来保持数字的可管理性。

>>> 1 / 10
0.1

对于大多数用例,可以安全地忽略不准确性。如果要处理的数字非常小或非常大,或者需要精确到许多小数位,则可以使用十进制

 >>> Decimal('111.85') * Decimal('111.85')
 Decimal('12510.4225')