记录一下浮点数精度设置的几种方法
1. round方式
内置函数,四舍五入,但是和我们一般理解意义上的四舍五入不太一样,先看下使用姿势
1round(digit, num)
第一个参数是浮点数,第二个参数标识保留的小数个数,第二个参数不传时,标识保留0个小数
接下来看下为什么说这个方法和传统的四舍五入不一样
一般的四舍五入实现是 (a + 0.5) 然后取整;但是我们这里却不是这样的
其规则如下:
碰到舍入的后一位为5的情况,如果要取舍的位数前的数是偶数,则直接舍弃,如果奇数这向上取舍
2. 字符串格式化
使用字符串的格式化方式来间接实现我们希望的效果
1"%.xf" % digit
其中 x 表示具体需要保留的小数位数,digit 表示需要格式化的浮点数,它的实现效果和round一样
3. math.ceil与math.floor
对于精度的设置,一般除了四舍五入之外,还有几种常见的就是向上,向下取整,因此 ceil 和 floor 就比较合适了
1
2
3
4
5
6
7
8
9
10
11from math import ceil, floor
# ceil 向上取整
ceil(1.2)
ceil(-1.2)
ceil(1.0)
# floor 向下取整
floor(1.2)
floor(-1.2)
floor(1.0)
4. decimal 精度
如果对精度要求比较高,可以考虑使用decimal来操作
1
2
3
4
5
6
7
8from decimal import *
def floatAdd(num1, num2, precision=2):
getcontext().prec = precision # 设置精度
return float(Decimal(str(num1)) + Decimal(str(num2)))
print(floatAdd(1.234567, 5.312, 4))
print(float(Decimal(str(12345.67)) + Decimal(str(125.1))))
注意上面的precision并不是表示保留多少位小数,而是最终的返回的“有效数字”个数(有效数字打引号,注意不是数学上的有效数字)
II. 其他
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明
尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
QQ: 一灰灰/3302797840
3. 扫描关注
一灰灰blog
知识星球