7

当 Python 中的经典表示错误开始成为问题时,我遇到了一种情况:我需要将它们用于 Numpy 中的矩阵运算,并且尚不支持小数类型。

你们都知道,如果我这样做,111.85 * 111.85我会得到12510.422499999999,但如果我round(12510.422499999999, 4)能得到正确的结果,那当然是12510.4225

但实际的问题是:

  • 这个圆形的东西是一个好主意和一个好习惯吗?
  • 这适用于所有情况吗?有时小数位置 ..999 可能更多
  • 最后,如何为所有可能的值获得适当的小数位数以用于该轮次?
4

2 回答 2

6

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

python 文档专门介绍了一个部分

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

>>> 0.1
0.1000000000000000055511151231257827021181583404541015625

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

>>> 1 / 10
0.1

对于大多数用例,可以放心地忽略不准确性。如果您正在处理极小或极大的数字,或者需要精确到小数位,您可以使用十进制

 >>> Decimal('111.85') * Decimal('111.85')
 Decimal('12510.4225')
于 2016-01-06T19:57:59.300 回答
5

这里真正的问题是首先确定表示错误如何开始成为问题。

您不应该将表示用于人类可读的浮动打印,您应该使用例如str.format或其他一些表示方法。

将您的数字作为所有计算的数字(无论您是使用浮点数还是小数还是其他什么......),并且只在演示时舍入或截断事物。

于 2016-01-06T19:49:40.780 回答