python小数点_python 小数点问题

我想生成一组小数,大小为从0到1,间隔为0.2,即:[0, 0.2, 0.4, 0.6, 0.8, 1]

1. while循环生成

a_list = []

i = 0

while i <= 1:

a_list.append(i)

i += 0.2

print(a_list)

打印结果为:

[0, 0.2, 0.4, 0.6000000000000001, 0.8, 1.0]

奇怪,为什么会有0.600000000000001这样子的结果呢?

如果我间隔设置为0.1,即我想要得到这样的list:[0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]

a_list = []

i = 0

while i <= 1:

a_list.append(i)

i += 0.1

print(a_list)

打印结果为:

[0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.9999999999999999]

2.利用numpy包

import numpy as np

a = np.arange(0, 1, 0.2)

print(a)

打印结果为:

[0. 0.2 0.4 0.6 0.8]

# 解释: 由于结果是array,0后面跟了一个点。每个数值用空格隔开。

将array转成list

print(a.tolist())

打印结果:

[0.0, 0.2, 0.4, 0.6000000000000001, 0.8]

和while循环生成的结果还是一样。

再用0.1的间隔试一下:

b = np.arange(0, 1, 0.1)

print b.tolist()

打印结果:

[0.0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6000000000000001, 0.7000000000000001, 0.8, 0.9]

居然跟while循环生成的还不一样了。

不知道该怎么解释了?

浮点数的一个普遍问题是它们并不能精确的表示十进制数。 并且,即使是最简单的数学运算也会产生小的误差,比如:

>>> a = 4.2

>>> b = 2.1

>>> a + b

6.300000000000001

>>> (a + b) == 6.3

False

这些错误是由底层CPU和IEEE 754标准通过自己的浮点单位去执行算术时的特征。 由于Python的浮点数据类型使用底层表示存储数据,因此你没办法去避免这样的误差。

解决方法1:

round() 方法返回浮点数x的四舍五入值。第一个参数是一个浮点数,第二个参数是保留的小数位数,可选,如果不写的话默认保留到整数。比如:

>>> round(10.0/3, 2)

3.33

>>> round(20/7)

3

如果不涉及到非常精确的计算:

l = list()

i=0

while i <= 1:

l.append(round(i,1))

i += 0.2

print(l)

[0, 0.2, 0.4, 0.6, 0.8, 1.0]

解决方法2:

decimal函数,

用在非常精确的小数或浮点数计算上

from decimal import Decimal

l = list()

i = 0

while i <= 1 :

l.append(str(Decimal(i).quantize(Decimal('0.0'))))

i +=0.2

print(l)

打印结果为:

['0.0', '0.2', '0.4', '0.6', '0.8', '1.0']

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值