十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
是利用原来的向下取整的机制如果原来是
创新互联公司是一家专注于做网站、成都做网站与策划设计,钟祥网站建设哪家好?创新互联公司做网站,专注于网站建设十多年,网设计领域的专业建站公司;建站业务涵盖:钟祥等地区。钟祥做网站价格咨询:18982081108
实际上Python的round()函数可以接受两个参数round(value,ndigits),第一个参数为实际操作数,第二个参数为实际保留几位,如果第二个参数不填,则默认保留到整数位。
Python3.X对于浮点数默认的是提供17位数字的精度。
float('{:.2f}'.format(price_t))
这样只是取两位小数并没有四舍五入
四舍五入有一个专门的函数round,下面是正确的用法
round(float(price_t), 2)
x=1.1111
print(round(x,2))
round(a,b)函数,a使需要四舍五入的数字,b是需要保留几位。
它是内置函数。build-in,应该是C语言的。用的应该是 c的library
在python2.73.源码中
有这样一句。pymath.h:extern double round(double);
在pymath.c中定义如下:
#ifndef HAVE_ROUND
double
round(double x)
{
double absx, y;
absx = fabs(x);
y = floor(absx);
if (absx - y = 0.5)
y += 1.0;
return copysign(y, x);
}
python保留2位小数一般用以下几种:
①round函数
②format(float_num,'0.2f')
③decimal
一、先说下这次的重点想说的decimal,可以精确的四舍五入保留两位小数。
①可以传给decimal整形或者字符型,不能传浮点型,因为浮点型本身就是不精确的数
但是如果一定要是浮点型,可以以下:
正常情况下
二、round函数,大部分情况下可以四舍五入,但是遇到要保留位数后一位是5时,是不会进1位的
三、format和round类似
因为二进制浮点数不能解决这个问题。
先看一个现象,和 round 无关的:
def show(x):
... """打印一个数,20 位精度"""
... print('{:.20f}'.format(x))
...
show(1.5)
1.50000000000000000000
show(1.25)
1.25000000000000000000
show(1.245)
1.24500000000000010658
show(1.45)
1.44999999999999995559
show(1.415)
1.41500000000000003553
从数学上看,一个既约分数(有理数)n/d 要表示为 B 进制数,如果 d
的所有素因子都整除 B,就说明存在一个整数 k,使得分母 d 整除 B^k——比如 q * d = B^k,于是此时有 n/d = n /
(B^k / q) = nq / B^k,也就是说 n/d 可以使用至多 k 位数的 B 进制小数有限表示。
反之,也容易证明,如果 d 有素因子不能整数 B,那么就不存在上面的 k,也就是说有理数 n/d 不可能由有限位数的 B 进制数表示。——也就是说会出现循环小数。
对于 10 进制数,所有分母只有素因子 2 和 5 的有理数,都能表示为有限小数。比如 1/2 是 0.5,1/4 是 0.25,1/5 是 0.2,3/8 是 0.375,都是有限的。
而对于 2 进制数,分母里面只有素因子 2 的有理数,才能表示为有限小数。所以 1/2 是 0.1,1/4 是 0.01,3/8 是 0.011。但 1/5 就不能用有限二进制数表示了,是个循环小数 0.0011 0011 0011……。
(什么,你问无理数?小学生都知道无理数是无限不循环小数。)
现在:
计算机的浮点数是用小数表示的。浮点数就是科学计数法,指数部分是个整数,尾数部分是个小数。
计算机的存储是有限的,所以只能使用有限位数的小数表示。
计算机硬件通常是用二进制运算的。
具体到 Python 的 float,C/C++ 的 float/double,都是有限长度的、二进制、浮点数。准确地说,是这个:IEEE floating point
现在问题来了。人写程序用十进制数,计算机运行程序用二进制数,怎么办?转换呗。
从概念上说,就是我写:
a(10) = 0.5
计算机读:
a(2) = 0.1
我写:
b(10) = 0.375
计算机读
b(2) = 0.011
可如果我写
c(10) = 0.2
计算机就只能读成了有限位数,比如 12 位:
c(2) = 0.0011 0011 0011(咔嚓切断)
其实这个被截断保留 12 位二制制位的数用十进制表示是 0.199951171875,已经不准了。你说不对呀这个小了,最后一位能不能加上去,让计算机读成
c(2) = 0.0011 0011 0100(进了一位)
这个数用十进制表示则是 0.2001953125,又大了。
——实际的计算机中,python 的 float 是用 64 位浮点数,其中 53 位是尾数部分,误差小得多了,但还是不可能没有。
所以,计算机在把人写的程序转换为内部代码的时候,就必须做十进制到二进制的转换。这个转换就已经不得不带来误差了。当然,像前面说的,不是所有的数都有误差,0.5、3.75、78.625 都不会有误差,但简单的 0.2、3.15 就会有进制转换误差。
所以,在开始计算 round 这个四舍五入的函数之前,在程序刚被读入计算机时,这个变量的值早已经不精确了。round 又能解决什么问题?
话
说回来,round 本身在一些情况下是准确的。比如 0.5、1.5、2.5、3.5 这些数,都能用有限位二进制数表示,它们直接 round
的结果也都是准确的,不过使用的不是四舍五入而是无偏算法(把 0.5 向偶数而不是向上舍入,这里指 Python 3)。round
在另一些情况下又可能是不准确的,因为 Python 的 round
有两个参数,第二个参数表示舍入到第几位,就需要对原数先计算再舍入,就不准确了。
如果让 Python
减慢速度,也在内部用十进制表示和计算,就不会出现进制转换和移位这种来源的舍入误差,此时做舍入运算或输入输出就是精确的了。虽然这不能防止其他计算
(比如除法、三角函数)带来的误差,但在一些场合,比如金融算钱的时候,还是非常有用的。在 Python 里面可以用 decimal
包来使用十进制浮点数,避免输入输出的带来的进制转换误差,按十进制移位时除法带来的误差等。
小结:
误差主要来自输入时十进制转换为计算机内部二进制时,且这个问题在有限精度下不可能解决,也不需要解决。
round 可以准确舍入,但它涉及的移位计算也可能带来其他误差。
Python 的 decimal 包可用于解决这一问题。