来自 首页 2019-09-25 06:27 的文章
当前位置: 澳门太阳娱乐手机登录 > 首页 > 正文

ROUND函数的使用,小数精度控制问题

SQL ROUND函数是对数据开展制订精度的取值。

总计一下小数精度的管理难点

图片 1

一、round()函数内置方法

 

  round(number,[ndigits]):round 对传播的数目进行四舍五入,但并不是守旧意义上的四舍五入。number:供给被管理的参数;ndigits:保留的位数。

第三个参数是取值的数目,第4个参数是精度,第八个参数是多少取值形式(四舍五入如故截断),当中第多少个参数是可选参数,暗许是四舍五入形式。

  ndigits:不取值,number的小数部分未有0.5的时候,则依据四舍五入进行取值;

图片 2

        不取值,number的小数部分存在0.5的时候,round()取邻近的偶数;

 

      取值,number的小数部分从没.5的时候,则依据四舍五入进行取值;

 从地点结果能够观望,数据并非只保留两位小数,而是保存两位有效小数。

      取值,number的小数部分存在.5的时候,小数位前是奇数则扬弃,小数位前是偶数则向上取(意味着,一旦出现小数位后为.5的,则小数位前取值,不能够取到偶数);

图片 3

#  ndigits 不取值的时候
print("1:", round(2.5))  # 存在0.5,取值靠近偶数: 2
print("2:", round(2.55))  # 不存在0.5,取值按照四舍五入:3
print("3:", round(3.5))  # 存在0.5,取值靠近偶数:4
print("4:", round(4.5))  # 存在0.5,取值靠近偶数:4
print("5:", round(4.54))  # 不存在0.5,取值按照正常的四舍五入
print("6:", round(5.5))  # 存在0.5,取值靠近偶数:6

#  ndigits 取值的时候
print("7:", round(2.635, 2))  # 存在.5,小数位前奇数: 2.63
print("8:", round(2.645, 2))  # 存在.5,小数位前偶数:2.65
print("9:", round(2.655, 2))  # 存在.5,小数位前奇数:2.65
print("10:", round(2.665, 2))  # 存在.5,小数位前偶数:2.67
print("11:", round(2.675, 2))  # 存在.5,小数位前奇数:2.67
print("12:", round(2.634, 2))  # 不存在.5,按照四舍五入: 2.63
print("13:", round(2.636, 2))  # 不存在.5,按照四舍五入: 2.64

从地方三回能够见见,暗中认可不使用第两个参数是四舍五入情势。

二、格式化管理

图片 4

  输出格式%.mf:管理体制个round()函数一致,m指获得位数,f是指float数据类型

 

#  m不取值的时候
print("1: %.f" % 2.5)  # 存在0.5,取值靠近偶数: 2
print("2: %.f" % 3.5)  # 存在0.5,取值靠近偶数: 4
print("3: %.f" % 3.4)  # 不存在0.5,按照四色五入: 2
print("4: %.f" % 3.6)  # 不存在0.5,按照四舍五入: 2

#  m=2 取值的时候
print("4: %.2f" % 2.635)  # 存在.5,小数位前奇数: 2.63
print("5: %.2f" % 2.645)  # 存在.5,小数位前偶数:2.65
print("6: %.2f" % 2.655)  # 存在.5,小数位前奇数:2.65
print("7: %.2f" % 2.665)  # 存在.5,小数位前偶数:2.67
print("8: %.2f" % 2.675)  # 存在.5,小数位前奇数:2.67
print("9: %.2f" % 2.634)  # 不存在.5,按照四舍五入: 2.63

其八个参数借使是0,则四舍五入,若是是非0,则截断

三、抢先20位精度深入分析

图片 5

  python中暗中认可的为17位小数精度,但要是我们须求选拔更加高精度的时候(意味着超越17人小数),假设拍卖?

经过结果发掘,前边的5被截断,保留了两位有效小数。

  使用前边二种办法开展管理,查看一下管理结果:

其余,假诺精度为负数,则为整数部分正确取值。

print("1: %.30f" % (1/3))  # 输出:1: 0.333333333333333314829616256247
print("2: %s" % round((1/3), 30))  # 输出:2: 0.3333333333333333

图片 6

光天化日后面两种办法是不适用的,round()内置函数其结果只好取到小数点后14人;而格式化管理就算能够取到三九个人,但其精度是不正确的。

 

下边介绍一种方式:高精度使用 decimal模块,合营getcontext

 

print(getcontext())
getcontext().prec = 50    # 设置全局精度
b = Decimal(1)/Decimal(3)
print(b)
c = Decimal(1)/Decimal(17)
print(float(c))
SELECT ROUND(987.45,-2)

 四、关于小数和取整

图片 7

1.math模块下的ceil(x)函数:取大于或然等于x的小不点儿整数

并发谬误是因为987.45为decimal(5,2),它不能表示一千.00,此时须求改变数据类型

2.math模块下的floor(x)函数:取小于恐怕等于x的最大整数

图片 8

from math import ceil, floor

# ceil():取大于或等于x的最小整数
print("1: %s" % ceil(2.5))  # 1: 3
print("2: %s" % ceil(2.3))  # 2: 3
print("3: %s" % ceil(2.6))  # 3: 3

# floor():取小于或等于x的最大整数
print("4: %s" % floor(2.5))  # 4: 2
print("5: %s" % floor(2.3))  # 5: 2
print("6: %s" % floor(2.6))  # 6: 2

 

五、截取小数点后bit位

参考: 

编写制定函数cut(self,bit)进行拍卖

def cut(self, bit):
    str_sli = str(self).split('.', 1)
    sli = len(str_sli[0]) + bit + 1
    result = str(self)[:sli]
    return result

a = cut(3.1356, 2)
print(a)    #输出结果为: 3.13

 

 

 

本文由澳门太阳娱乐手机登录发布于首页,转载请注明出处:ROUND函数的使用,小数精度控制问题

关键词: