python str转小数(按真实世界四舍五入保留任意小数位)

Python 专栏收录该内容
118 篇文章 4 订阅

先入个门:

Python str转化成数字

int(x [,base ])         将x转换为一个整数    

long(x [,base ])        将x转换为一个长整数    

float(x )               将x转换到一个浮点数    

complex(real [,imag ])  创建一个复数    

str(x )                 将对象 x 转换为字符串    

repr(x )                将对象 x 转换为表达式字符串    

eval(str )              用来计算在字符串中的有效Python表达式,并返回一个对象    

tuple(s )               将序列 s 转换为一个元组    

list(s )                将序列 s 转换为一个列表    

chr(x )                 将一个整数转换为一个字符    

unichr(x )              将一个整数转换为Unicode字符    

ord(x )                 将一个字符转换为它的整数值    

hex(x )                 将一个整数转换为一个十六进制字符串    

oct(x )                 将一个整数转换为一个八进制字符串 


举个栗子:

小数点后取2位(四舍五入)的方法
方法一:round()函数
其实这个方法不推荐大家使用,查询资料发现里面的坑其实很多,python2和python3里面的坑还不太一样,在此简单描述一下python3对应的坑的情况。

a = 1.23456
b = 2.355
c = 3.5
d = 2.5
print(round(a, 3))
print(round(b, 2))
print(round(c))
print(round(d))

结果:

1.235   # 1.23456最终向前进位了
2.35    # 2.355居然没进位
4       # 最终3.5居然变为4了
2       # 最终2.5取值变为2

(1)通过上面的函数,看着是不是很晕,感觉round(x,n)函数是否进位也没看出是啥规律
(2)round(x,n)函数中,是否进位或四舍五入,取决于n位以及n+1位小数的值
(3)只有当n+1位数字是5的时候,容易混淆,如果n为偶数,则n+1位数是5,则进位,例如round(1.23456,3)最终变为1.235
(4)如果n为奇数,则n+1位是数5,那不进位,例如round(2.355,2),最终为2.35
(5)如果n为0,即没有填写n的时候,最终结果与上面相反,即整数部分为偶数的时候,小数位5不进位,例如(round(2.5)变为2)。
(6)整数部分为奇数的时候,小数位5进位。(round(3.5)变为4)
看完如上的部分,感觉是不是更晕了,所以round()不推荐使用,目前也不知道设计这个函数的目的在哪里?有谁知道麻烦告知一下?

方法二:’%.2f’ %f 方法
f = 1.23456

print('%.4f' % f)
print('%.3f' % f)
print('%.2f' % f)

结果:

1.2346
1.235
1.23

(1)这个方法是最常规的方法,方便实用,居家旅行必备!

方法三:Decimal()函数
from decimal import Decimal

aa = Decimal('5.026').quantize(Decimal('0.00'))
bb = Decimal('3.555').quantize(Decimal('0.00'))
cc = Decimal('3.545').quantize(Decimal('0.00'))

print(aa)
print(bb)
print(cc)

结果:

5.03
3.56
3.54

decimal这个模块在很少用,如上图中,3.555结果为3.56,而3.545结果变为3.54,一个5进位了,一个是5没进位,具体原因不详。 
所以不推荐使用这个方法!!!

--------------------- 
所以我具体讲一下方法二,我也是用的方法二:

a=1 a=("%.2f" % a)

print a #结果1.00

其中我遇到的问题是a是小数形式的字符串,然后不可以直接'%.xf'

x表示四舍五入保留多少位小数。其中a是数字类型才可。包括小数,整数。

但是我是字符串,我就先float转为小数,但是python转小数会出问题,所以先float后,在用方法二保留希望是位数,

就不会丢失精度了。

s1=(float(date[7])+float(date[8])+float(date[9])+float(date[10]))
a1=("%.2f" % s1)

直接s1结果丢失精度,再进行一次方法二就四舍五入,符合现实的要求规律。



原文:https://blog.csdn.net/chenmozhe22/article/details/81666831 

           http://www.cnblogs.com/aiyr/p/6830981.html

           https://blog.csdn.net/qq_26033611/article/details/80448700

  • 3
    点赞
  • 0
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值