Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 舍入浮动,表示错误为最接近且正确的结果_Python_Python 3.x_Numpy_Bit Representation - Fatal编程技术网

Python 舍入浮动,表示错误为最接近且正确的结果

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小数可能更大 最后,如何获得适当数量的小数点位置,以用于所有可能值

当Python中的经典开始成为问题时,我遇到了这样一种情况:我需要将它们用于Numpy中的矩阵运算,而decimal类型还不受支持

大家都知道,如果我做
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')