Python 浮点数指定、控制精度、四舍五入问题。(多种方法:格式化、format()、round()、decimal())

 先说常用的控制方式: 格式化 和 format()

格式化演示

a=0.3051
b=0.315
c=0.305
print("%.2f"%a)
print("%.2f"%b)
print("%.2f"%c)

结果 

0.31
0.32
0.30

 格式化特点:指定保留小数的位数,并四舍五入,不抹去最右边的0(这是一般情况!!!)

 特殊情况:当小数有n+1位,需要保留n位小数,且恰好第n+1位是5,进位有时不准。如打印c的情况。

format()演示:

a=0.3051#一般情况
b=0.315#特殊情况
c=0.305#特殊情况
print('{:.2f}'.format(a))
print('{:.2f}'.format(b))
print('{:.2f}'.format(c))

 结果:

0.31
0.32
0.30

format()特点:指定保留小数的位数,并四舍五入,不抹去最右边的0(这是一般情况!!!)

 特殊情况:当小数有n+1位,需要保留n位小数,且恰好第n+1位是5,进位有时不准。如打印c的情况。

可以看出格式化和format()的效果一样,有共同的特点。

下面还有两种不是常用的两种方法round()和decimal():

代码演示: 

#方法一:用round(f,n),f为传入参数,n为需要保留小数的位数。
print("未指定小数位数,不做任何处理")
print("110.3+0.1=",110.3+0.1)#未指定小数位数
print("0.2+0.1=",0.2+0.1)
print("指定小数位数")
print("110.3+0.1=",round(110.3+0.1,2))#指定保留小数的位数,并四舍五入,抹去最右边的0(这是一般情况!!!)
#特殊情况:当小数有n+1位,需要保留n位小数,且恰好第n+1位是5,进位有时不准。
print("10.545=",round(10.545,2),"100.175",round(100.175,2),"10.175",round(10.175,2))
print("第一个没进位,    第二个没进位,   第三个又进位了")
#第一个没进位,    第二个没进位,  第三个又进位了。让人瞬间头疼了,根本原因是内部的二进制计算问题导致进位不准。

#方法二:用decimal和getcontext来提高精度或者指定精度(一般情况下用不上)
from decimal import Decimal,getcontext
print("只是提高精度")
print("110.3+0.1=",Decimal(110.3+0.1))
print("0.2+0.1=",Decimal(0.2+0.1)+0)
print("指定精度")
getcontext().prec=5 #指定取5位数字,包括整数部分(同样四舍五入),不抹去最右边的0
print("110.3+0.1=",Decimal(110.3+0.1)+0) #需要有运算符如”+、-”,才能指定精度
getcontext().prec=50 #可以在提高精度的基础上再提高精度
print("0.2+0.1=",Decimal(0.2+0.1)+0)

 运行结果:

110.3+0.1= 110.39999999999999
0.2+0.1= 0.30000000000000004
指定小数位数
110.3+0.1= 110.4
10.545= 10.54 100.175 100.17 10.175 10.18
第一个没进位,    第二个没进位,   第三个又进位了
只是提高精度
110.3+0.1= 110.3999999999999914734871708787977695465087890625
0.2+0.1= 0.3000000000000000444089209850
指定精度
110.3+0.1= 110.40
0.2+0.1= 0.30000000000000004440892098500626161694526672363281

 round()方法与最上面两种方法有一样的效果,注释里已说明。decimal()方法特点见注释。

 

  • 12
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值