我什么时候可以安全地使用浮点运算?

2024-05-29 06:43:02 发布

您现在位置:Python中文网/ 问答频道 /正文

你好,我正在处理很多这样的数字:0.00000005,0.000341,3423.52322154。基本上是比特币和altcoin数字。

现在我知道如果我在python中这样做

>>> 0.1 + 0.2
0.30000000000000004

这是不正确的,我可以str我的变量,并把它们放在十进制模块中来修正它。我的问题是,我不知道什么时候float足够好,因为我可能有点孤独症,当谈到性能和理解我在做什么时,我在想,我可能在不需要十进制模块的时候使用得太多了。

当我在做数学的时候,我怎么知道我什么时候需要使用十进制呢?

编辑:好吧,很多人都认为,因为我在处理比特币和altcoin数字,所以我想计算它来购买确切的金额或其他任何东西,但对我来说,情况并非总是如此。我还想每秒取200个数字,快速计算出amount*rate以便于显示,也许float可以足够好。我想对于这些问题没有简单的答案(我想我必须阅读数字的二进制表示法等等)。

也有人建议我把数字表示为整数,然后存储小数位,然后在计算后放回原处。我不知道这是否比十进制快?


Tags: 模块答案编辑rate二进制情况数字数学
2条回答

如果它需要非常精确,你不应该真的使用浮动。相反,您应该存储两个整数,一个包含不带小数点的数字,另一个显示在显示或其他内容时应该分成多少个小数位。

float可能有用的时间是,当您执行小数点后3位或4位以内的操作时,您可以在每次计算后使用round函数将所需的小数位数舍入。在

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

相关问题 更多 >

    热门问题