舍入浮动与表示错误到最接近和正确的结果

ger*_*esc 7 python numpy bit-representation python-3.x

我有一种情况,当Python中的经典表示错误开始成为一个问题:我需要它们用于Numpy中的Matrix操作,并且还不支持十进制类型.

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

但实际问题是:

  • 这轮会是一个好主意和一个好习惯吗?
  • 这适用于所有情况吗?有时小数位置,其中..999小数可能更多
  • 最后,如何获得适当的小数位数以用于所有可能值的回合?

Bre*_*bel 6

即使你对数字进行四舍五入,小数仍然不会完全符合你的预期.Python可能只显示最高有效位,但基础十进制不准确仍然存在.

python docs 专门用它来创建一个部分

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

>>> 0.1
0.1000000000000000055511151231257827021181583404541015625
Run Code Online (Sandbox Code Playgroud)

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

>>> 1 / 10
0.1
Run Code Online (Sandbox Code Playgroud)

对于大多数用例,可以安全地忽略不准确性.如果您处理极小或极大的数字或需要精确到多个小数位,您可以使用十进制 库

 >>> Decimal('111.85') * Decimal('111.85')
 Decimal('12510.4225')
Run Code Online (Sandbox Code Playgroud)


wim*_*wim 5

这里真正的问题是确定表示错误如何首先成为一个问题.

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

将您的数字保存为所有计算的数字(无论您是使用浮点数还是小数或其他数字......)并且只在展示时对事物进行舍入或截断.

  • @GermanRosales:你原来的预先回答的答案已经准确到小于0.7 ulps.如果这个准确度不够好(为什么不呢?)那么float64将无法满足您的需求.但是你应该弄清楚你是否真的需要那么高的准确度. (2认同)