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

时间:2018-01-19 16:45:27

标签: python math decimal bitcoin

您好我正在处理大量这样的数字:0.00000005,0.000341,3423.52322154。基本上是比特币和山寨币数字。

现在我知道如果我在python中执行此操作

>>> 0.1 + 0.2
0.30000000000000004

它不正确,我可以将我的变量括起来并将它们放在Decimal模块中来修复它。我的问题是,我不知道漂浮的时间/足够好/因为我在表现和理解我所做的事情时可能有点自闭症我想我也许在不需要时使用十进制模块。

那么我怎么知道什么时候我需要在我做数学时和我不需要时使用十进制?

编辑:好的,很多人都在假设,因为即时通讯处理比特币和山寨币数字我想计算它来购买精确的金额或其他什么,但对我来说情况并非如此总是。我还希望每秒钟拍摄200个数字,并快速计算出数量*显示用途,也许浮动可以足够好。我认为这些东西没有简单的答案(我想我必须阅读数字的二进制表示等)。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

如果它需要非常精确,你就不应该使用花车。相反,你应该存储两个整数,一个是没有小数点的数字,另一个是显示它在显示时应分成多少小数位。

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