python浮点数怎么表示_python浮点数

浮点数是近似值,它们不能精确地存储十进制数.因为它们试图仅以64位表示非常大的数字范围,所以它们必须在某种程度上接近.

了解这一点非常重要,因为它会导致一些奇怪的副作用.例如,您可能会非常合理地认为十批0.1的总和为1.0.虽然这似乎是合乎逻辑的,但在浮点时它也是错误的:

>>> f = 0.0

>>> for _ in range (10):

... f += 0.1

...

>>> print f == 1.0

False

>>> f

0.99999999999999989

>>> str(f)

1.0

您可能认为n / m * m == n.浮点世界再一次不同意:

>>> (1.0 / 103.0) * 103.0

0.99999999999999989

或者也许同样奇怪的是,人们可能会认为对于所有n,n 1!= n.在浮点土地上,数字不能像这样工作:

>>> 10.0**200

9.9999999999999997e+199

>>> 10.0**200 == 10.0**200 + 1

True

# How much do we have to add to 10.0**200 before its

# floating point representation changes?

>>> 10.0**200 == 10.0**200 + 10.0**183

True

>>> 10.0**200 == 10.0**200 + 10.0**184

False

如果您需要精确的十进制表示,请查看decimal模块,这是自2.4以来python标准库的一部分.它允许您指定有效数字的数量.缺点是,它比浮点慢得多,因为浮点运算是在硬件中实现的,而十进制运算完全是在软件中实现的.它也有自己的不精确问题,但如果你需要十进制数的精确表示(例如,对于金融应用程序),它是理想的.

例如:

>>> 3.14

3.1400000000000001

>>> import decimal

>>> decimal.Decimal('3.14')

>>> print decimal.Decimal('3.14')

3.14

# change the precision:

>>> decimal.getcontext().prec = 6

>>> decimal.Decimal(1) / decimal.Decimal(7)

Decimal('0.142857')

>>> decimal.getcontext().prec = 28

>>> decimal.Decimal(1) / decimal.Decimal(7)

Decimal('0.1428571428571428571428571429')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值