Closed. This question needs details or clarity。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
                        
                        2年前关闭。
                                                                                            
                
        
您好,我正在处理许多数字,例如:0.00000005、0.000341、3423.52322154。基本上是比特币和山寨币的数字。

现在我知道如果我以python为例

>>> 0.1 + 0.2
0.30000000000000004


这是不正确的,我可以将变量str放入Decimal模块中进行修复。我的问题是我不知道什么时候float足够好/因为在性能和理解我在做什么时我可能有点自闭症,我想我可能在什么时候使用了十进制模块太多不需要。

那么我怎么知道什么时候做数学以及什么时候不需要使用Decimal?

编辑:好的,很多人都认为因为即时通讯正在处理比特币和山寨币的数字,所以我想计算它来购买确切的金额或其他,对于我而言,情况并非总是如此。我还希望每秒接收200个数字,并快速计算数量*速率以用于显示目的,也许浮动可能就足够了。我想这些事情并没有简单的答案(我想我必须阅读数字的二进制表示形式等)。

人们还建议我将数字表示为整数,然后再存储小数位,然后在计算后放回去。我不知道这比十进制快吗?

最佳答案

Python具有语言附带的decimal模块:尽管从技术上讲,它是“浮点数”,但实际上它处理的是十进制数字,直到您指定的数字精度为止。

因此,可以使用小数点后的18个左右的数字,某些加密货币(例如以太坊)会使用由于基数移位或舍入而引入的零错误。

>>> from decimal import Decimal as D
>>> D("0.1") + D("0.2")
Decimal('0.3')
>>> (D("0.1") + D("0.2")) * D("0.00000000001") + D("0.1")
Decimal('0.100000000003')
>>>


由于必须从字符串构造Decimal实例,因此它看起来像是人为的,但这只是为了避免像最初看到的那些错误。这些对象支持所有数字运算,并且可以轻松转换为没有舍入错误的字符串,可在您拥有的任何API上使用。

https://docs.python.org/3/library/decimal.html

07-28 08:55