python floor(Python的floor除法现在使用“//”实现,那么3.0//2.0的计算结果是)

本文目录
- Python的floor除法现在使用“//”实现,那么3.0//2.0的计算结果是
- Python实现txt文件读取数字,排序,求均值
- 为什么Python中//和math.floor运算结果会不同
- Python中floor的用处(功能)是什么
- python3.2取消了浮点数,比如 >>>import math >>>math.floor(32.9) >>>32 这时候我想要32.0咋办
- Python Floor除法怎么算
Python的floor除法现在使用“//”实现,那么3.0//2.0的计算结果是
Python的floor除法现在使用“//”实现,那么3.0//2.0的计算结果是?
A.1.5
B.1
C.1.0
D.0
正确答案:C
Python实现txt文件读取数字,排序,求均值
python用法非常简单。
代码如下:
import math
f=open("1.txt")
s=f.read()
nums=s.split(" ")
sum=0
count=len(nums)
min=-99999999
for num in nums:
sum=sum+int(num)
avg=math.floor(sum/count)
nums.sort(key=int)
result=’’
f=open("2.txt","w")
reault=result+’ ’.join(nums)
result=str(result)+" "+str(avg)
f.write(result)
这样就可以了。
为什么Python中//和math.floor运算结果会不同
先说结论:这个问题是由于cpython的地板除运算符(//)的实现不是 浮点除法+floor 来实现而是用了(被除数 - 余数)/除数 导致的。
PS:Jython下可以得到20.0,而PEP里规定了a // b应该等于round(a/b),所以似乎这是cpython实现的一个bug?
首先先分析下1 / 0.05究竟应该等于多少。答案就是精确的20.0。
简单解释下:IEEE754浮点数规定,如果一个浮点数的值不能被精确记录,那么它的值会被记成与这个数距离最近的可以被IEEE浮点数表示的数。
首先,0.05在二进制下是无限循环小数,自然不能被精确记录,因此0.05这个浮点数的实际值是不等于0.05的,实际值是约为0.05 + 2.7e-18。
之后做浮点除法,实际上做的是1 / (0.05+2.7...e-18),这个除法的结果大约是20 - 1.1e-15。这个值也不能被精确表示,恰好离这个数最近的可以表示的值就是20.0,因此即使有浮点数误差结果也是精确的20.0。
既然1/0.05就是20.0,那么对他做floor运算自然也是20了。
现在的问题就是为什么1 // 0.05会变成19.0,要解决这个问题只能翻源码看//运算符的实现。
直接把cpython/floatobject.c at 829b49cbd2e4b1d573470da79ca844b730120f3d · python/cpython · GitHub 中实现//运算的一段贴上来:
static PyObject *
float_divmod(PyObject *v, PyObject *w)
{
double vx, wx;
double div, mod, floordiv;
CONVERT_TO_DOUBLE(v, vx);
CONVERT_TO_DOUBLE(w, wx);
if (wx == 0.0) {
PyErr_SetString(PyExc_ZeroDivisionError, "float divmod()");
return NULL;
}
PyFPE_START_PROTECT("divmod", return 0)
mod = fmod(vx, wx);
/* fmod is typically exact, so vx-mod is *mathematically* an
exact multiple of wx. But this is fp arithmetic, and fp
vx - mod is an approximation; the result is that div may
not be an exact integral value after the division, although
it will always be very close to one.
*/
div = (vx - mod) / wx;
if (mod) {
/* ensure the remainder has the same sign as the denominator */
if ((wx 《 0) != (mod 《 0)) {
mod += wx;
div -= 1.0;
}
}
else {
/* the remainder is zero, and in the presence of signed zeroes
fmod returns different results across platforms; ensure
it has the same sign as the denominator. */
mod = copysign(0.0, wx);
}
/* snap quotient to nearest integral value */
if (div) {
floordiv = floor(div);
if (div - floordiv 》 0.5)
floordiv += 1.0;
}
else {
/* div is zero - get the same sign as the true quotient */
floordiv = copysign(0.0, vx / wx); /* zero w/ sign of vx/wx */
}
PyFPE_END_PROTECT(floordiv)
return Py_BuildValue("(dd)", floordiv, mod);
}
可以发现cpython中x // y的实现实际上是
round((x - fmod(x, y)) / y)
,其中fmod函数是求两个浮点数相除的余数。
这样一来就解释的通了:在十进制下,显然1除以0.05的余数应该是0.0。然而在IEEE浮点数环境中,0.05的实际值是约0.05 + 2.7e-18,略大于0.05,这样一来1除以这个数的余数就成了约0.05 - 5e-17,从1中减掉这么多之后就只剩0.95了,除以0.05再round后变成19.0。
Python中floor的用处(功能)是什么
浮点型数据类型,也就是数学中的小数,它的精度可以通过print(sys.float_info)查看
python3.2取消了浮点数,比如 >>>import math >>>math.floor(32.9) >>>32 这时候我想要32.0咋办
不是取消了浮点数啊,floor是什么,向下取整啊,既然都是取整了返回的当然是整数了
大不了你可以这样
print (float(math.floor(32.9)))
Python Floor除法怎么算
从Python2.2开始,增加了一个操作符 // ,以执行地板除://除法不管操作数为何种数值类型,总是会舍去小数部分,返回数字序列中比真正的商小的最接近的数字。
123456
》》》1//20》》》1.0//20》》》-1//2.0-1

更多文章:
phpinfo(如何创建和查看phpinfo,phpinfo空白问题解决方法)
2025年6月10日 05:30
北京嵌入式培训班(七月份想去北京参加嵌入式培训,目前自己看了几个培训机构:千锋,凌阳,华清远见希望参加过培训的朋友)
2025年6月15日 20:30
学ug好还是solidworks好(solidworks与ug哪个更好学)
2026年4月23日 22:00
intellijidea如何升级(intellij idea 怎么让class自动更新到war)
2026年3月23日 11:00
sweet英语是什么意思?switch不能作用在string上面
2025年12月28日 17:00
数据库系统工具是什么(请问数据库系统软件有哪些,具体细节介绍一下)
2026年6月7日 14:45
protectedimage文件夹删除不了(文件夹删除不了怎么办)
2026年5月12日 12:15
datagridview不可编辑(如何设置datagridview可编辑)
2026年7月27日 22:30
powermill三轴主轴mtd文件(DXF文件直接转换为G代码,然后三轴雕刻机加工)
2026年7月5日 18:00
html文本区域怎么写(HTML文本区域区域带工具栏怎么做)
2026年2月6日 21:15
randomize在c语言(c语言怎样产生两个不同的随机数)
2025年11月8日 05:45











