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.
但实际问题是:
即使你对数字进行四舍五入,小数仍然不会完全符合你的预期.Python可能只显示最高有效位,但基础十进制不准确仍然存在.
python docs 专门用它来创建一个部分
由于显示值的方式,许多用户不知道近似值.Python仅将十进制近似值打印到机器存储的二进制近似值的真实十进制值.在大多数机器上,如果Python要打印存储为0.1的二进制近似值的真实十进制值,则必须显示
Run Code Online (Sandbox Code Playgroud)>>> 0.1 0.1000000000000000055511151231257827021181583404541015625这比大多数人认为有用的数字更多,因此Python通过显示舍入值来保持可管理的位数
Run Code Online (Sandbox Code Playgroud)>>> 1 / 10 0.1
对于大多数用例,可以安全地忽略不准确性.如果您处理极小或极大的数字或需要精确到多个小数位,您可以使用十进制 库
>>> Decimal('111.85') * Decimal('111.85')
Decimal('12510.4225')
Run Code Online (Sandbox Code Playgroud)
这里真正的问题是确定表示错误如何首先成为一个问题.
您不应该使用该表示形式进行人类可读的浮动打印,您应该使用例如str.format或其他一些表示方法.
将您的数字保存为所有计算的数字(无论您是使用浮点数还是小数或其他数字......)并且只在展示时对事物进行舍入或截断.