Python 舍入浮动,表示错误为最接近且正确的结果
当Python中的经典开始成为问题时,我遇到了这样一种情况:我需要将它们用于Numpy中的矩阵运算,而decimal类型还不受支持 大家都知道,如果我做Python 舍入浮动,表示错误为最接近且正确的结果,python,python-3.x,numpy,bit-representation,Python,Python 3.x,Numpy,Bit Representation,当Python中的经典开始成为问题时,我遇到了这样一种情况:我需要将它们用于Numpy中的矩阵运算,而decimal类型还不受支持 大家都知道,如果我做111.85*111.85我会得到12510.42249999999,但是如果我round(12510.42249999999,4)我可以得到正确的结果,当然是12510.4225 但实际问题是: 这一轮的东西是一个好主意和好做法吗 这适用于所有情况吗?有时小数的位置,..999小数可能更大 最后,如何获得适当数量的小数点位置,以用于所有可能值
111.85*111.85
我会得到12510.42249999999
,但是如果我round(12510.42249999999,4)
我可以得到正确的结果,当然是12510.4225
但实际问题是:
- 这一轮的东西是一个好主意和好做法吗
- 这适用于所有情况吗?有时小数的位置,..999小数可能更大
- 最后,如何获得适当数量的小数点位置,以用于所有可能值的舍入
str.format
或其他表示方法
在所有的计算中都要把你们的数字作为数字(不管你们是用浮点数还是小数或者其他什么…),并且在演示时只舍入或截断 即使你对数字进行四舍五入,小数点也不会完全符合你的预期。Python可能只显示最重要的位,但潜在的十进制误差仍然存在 python文档 由于这种方式,许多用户不知道近似值 将显示值。Python只打印十进制近似值 存储的二进制近似值的真正十进制值 机器。在大多数机器上,如果Python要打印真正的十进制数 存储为0.1的二进制近似值,它必须 展示
>>> 0.1
0.1000000000000000055511151231257827021181583404541015625
这比大多数人认为有用的数字还要多,因此Python保留了
通过显示舍入值来管理的位数
>>> 1 / 10
0.1
对于大多数用例,可以安全地忽略不精确性。如果你是
处理非常小或非常大的数量或需要
精确到小数点后许多位,您可以使用
图书馆
如果你想要比浮点更准确的话,考虑使用<代码>十进制<代码>或<代码>分数>代码>模块。不,你不能从<代码>回合<代码>操作中得到“适当”的结果!打印时它可能看起来像
12510.4225
,但Python存储的值实际上是12510.422500000000582076609134674072265625
。现在,您需要问问自己,这是否真的比12510.422499999987630872055888817596435546875的原始结果更好。(答案可能不是。)@Kevin对于某些矩阵运算,我需要Numpy支持这些值,我认为十进制/小数仍然不受支持(关于上面的内容,请参阅),一个可能的解决方案是将
向右移动,直到得到一个整数(在您的示例中,您将移动2个位置以获得11185
),然后您可以将整数相乘,并将手动在正确的位置添加一个
(左侧为2+2=4个位置)实际上不是显示人类可读的值,我使用这些值进行计算,但在这种情况下,我希望精度更高,并且我希望使用小数,但据我所知,Numpy不支持这种类型。@GermanRosales:您原来的预取整答案已经精确到小于0.7 ulps。如果精度不高的话够了(为什么不呢?)那么float64将不能满足您的需要。但您应该弄清楚您是否真的需要这样的精度水平。@MarkDickinson恐怕float64不适合我的需要,但我不能用float128做矩阵求逆运算(我在numpy的求逆运算中遇到了一个错误)@杰曼·罗萨莱斯:嗯,听起来你有一个很难解决的问题。无论如何,round
对你没有帮助:我想这里已经有几个很好的答案了。也许你应该问一个关于高精度矩阵求逆的新问题?(或者也许你的问题有数字的重新表述,可以避免一开始就需要高精度。)根据我的经验,几乎所有的时候,当人们认为他们需要更高精度的算术时,他们实际上并不需要。他们只需要更聪明的数学
>>> Decimal('111.85') * Decimal('111.85')
Decimal('12510.4225')