我有一种情况,当Python中的经典表示错误开始成为一个问题:我需要它们用于Numpy中的Matrix操作,并且还不支持十进制类型.
你们都知道,如果我这样做,111.85 * 111.85
我会得到,12510.422499999999
但如果round(12510.422499999999, 4)
我能得到正确的结果,那当然12510.4225
.
但实际问题是:
这轮会是一个好主意和一个好习惯吗?
这适用于所有情况吗?有时小数位置,其中..999小数可能更多
最后,如何获得适当的小数位数以用于所有可能值的回合?
Brendan Abel.. 6
即使你对数字进行四舍五入,小数仍然不会完全符合你的预期.Python可能只显示最高有效位,但基础十进制不准确仍然存在.
python docs 专门用它来创建一个部分
由于显示值的方式,许多用户不知道近似值.Python仅将十进制近似值打印到机器存储的二进制近似值的真实十进制值.在大多数机器上,如果Python要打印存储为0.1的二进制近似值的真实十进制值,则必须显示
>>> 0.1 0.1000000000000000055511151231257827021181583404541015625这比大多数人认为有用的数字更多,因此Python通过显示舍入值来保持可管理的位数
>>> 1 / 10 0.1
对于大多数用例,可以安全地忽略不准确性.如果您处理极小或极大的数字或需要精确到多个小数位,您可以使用十进制 库
>>> Decimal('111.85') * Decimal('111.85') Decimal('12510.4225')
wim.. 5
这里真正的问题是确定表示错误如何首先成为一个问题.
您不应该使用该表示形式进行人类可读的浮动打印,您应该使用例如str.format
或其他一些表示方法.
将您的数字保存为所有计算的数字(无论您是使用浮点数还是小数或其他数字......)并且只在展示时对事物进行舍入或截断.
即使你对数字进行四舍五入,小数仍然不会完全符合你的预期.Python可能只显示最高有效位,但基础十进制不准确仍然存在.
python docs 专门用它来创建一个部分
由于显示值的方式,许多用户不知道近似值.Python仅将十进制近似值打印到机器存储的二进制近似值的真实十进制值.在大多数机器上,如果Python要打印存储为0.1的二进制近似值的真实十进制值,则必须显示
>>> 0.1 0.1000000000000000055511151231257827021181583404541015625这比大多数人认为有用的数字更多,因此Python通过显示舍入值来保持可管理的位数
>>> 1 / 10 0.1
对于大多数用例,可以安全地忽略不准确性.如果您处理极小或极大的数字或需要精确到多个小数位,您可以使用十进制 库
>>> Decimal('111.85') * Decimal('111.85') Decimal('12510.4225')
这里真正的问题是确定表示错误如何首先成为一个问题.
您不应该使用该表示形式进行人类可读的浮动打印,您应该使用例如str.format
或其他一些表示方法.
将您的数字保存为所有计算的数字(无论您是使用浮点数还是小数或其他数字......)并且只在展示时对事物进行舍入或截断.