当前位置:首页 » 编程语言 » pythonfloor

pythonfloor

发布时间: 2023-03-18 13:16:27

python Floor除法怎么算

从Python2.2开始,增加了一个操作符 // ,以执行地板除://除法不管操作数为何种数值类型,总是会舍去小数部分,返回数字序列中比真正的商小的最接近的数字。

123456
>>>1//20>>>1.0//20>>>-1//2.0-1

❷ python3.5中的地板除问题

对最佳回答进行一些修改:在python3.X中利用/即可直接进行浮点运隐除法运算,即精确除法。而//的规则是:旁并厅先对被除数进蔽绝行四舍五入取整除数不动),然后运算除法,对运算结果进行无条件截断,只保留到整数部分,小数点后不保留。这个类似floor(),所以也叫地板除。

#加粗部分为修改部分

❸ PYTHON里的负数求余是怎么算的

在python中想搞清楚取余就要先搞清楚咐蔽谨整除

因为在python中取余遵循

a % b = a - (a // b) * b

那么

r = m // n, 而且始终取下, 即math.floor(r),且同号正, 异号负, 5 // -3 = -2, 5 // 3 = 1

那么, 令r = floor(a // b)

a > 0, b > 0, a - (a // b) * b = a - {取下值的正数, 故a > r * b} * b = 正数

a > 0, b < 0, a - (a // b) * b = a - {取下值衡基的负数, 故a < r * b} * b = 负数

a < 0, b > 0, a - (a // b) * b = a - {取下值的负数, 故a > r * b} * b = 正数

a < 0, b < 0, a - (a // b) * b = a - {取下值的正数, 故a < r * b} * b = 负数

所并枣以, 取余和被除数有关

❹ 为什么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 · 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 = sign(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 = sign(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里面地板除法是什么意思

// 称为地板除,两个整数的除法仍然是整数,它总是会舍去小数部分,返回数字序列中比真正的商小的,最接近的数字。
简单来说就是求商。
两个整数相除,返回整数
3 // 2
> 1
两个数的区中一个是浮点数,返回浮点数
3 // 2.0
> 1.0
负数除以正整数是负数自己本身
-1 // 2.0
> -1
负数除以负整数是0
-1//-4
> 0

❻ Python中floor的用处(功能)是什么

浮点型数据类型,也就是数学中的小数,它的精度可以通过print(sys.float_info)查看

❼ python中,取模运算是怎样的

对于整型数a,b来说,取模运算或者求余运算的键悔方法都是:
1.求 整数商: c = a/b;
2.计算模或者余数: r = a - c*b.
求模运算和扒简求余运算在第一步不同: 取余运算在取c的值时,向0 方向舍入(fix()函数);而取模运算在计算c的值时,向负无穷方向舍入(floor()函数)。
例如:计算-7 Mod 4
那么:a = -7;b = 4;
第一步:求整数商c,如进行求模运算c = -2(向负无穷方向舍入),求余c = -1(向0方向舍入);
第二步:计算模和余数的公式相同,但因c的值不同,求模时r = 1,求余时r = -3。
归纳:当a和b符号春亮裤一致时,求模运算和求余运算所得的c的值一致,因此结果一致。
当符号不一致时,结果不一样。求模运算结果的符号和b一致,求余运算结果的符号和a一致。
另外各个环境下%运算符的含义不同,比如c/c++,java 为取余,而python则为取模。

❽ python取模是什么意思

Python中的旁祥取模运算符用于求余数。它通常写作%,并用于计算两个整数相除时的余数。例如,如果我们将9除以4,得到2,余数为1,因此9 % 4等于1。

>>> 9 % 4
1

在Python中,取模运算符可用于任何整数,包括正整数、负整数和0。例如,以下代码演示了使用取模运算符来计算几个负整数的余数:

>>>友燃 -9 % 4
3
>>> -8 % 3
2
>>>好启虚 -7 % 2
1

❾ python中取整

定义:大于或等于 x 的最大整数 math.ceil(x)
向上取整运算为Ceiling,用数学符号⌈⌉表示

定义:小于或等于 x 的最大整数 math.floor(x)
向上取整运算为Floor,用数学符号⌊⌋表示

其实反斜杠 // 也能实现向下取整:

但是在某些情况下 // 和 math.floor(x) 的实现结果又不一样:

还是因为浮点数在计算机中存储值并不是0.05而是0.05...125,具体解释还是看这里吧 为什么Python中//和math.floor运算结果会不同 。

向0取整:x为负数时向上取整,x为正数时向下取整。
python中可用 int(x) 实现,也可以用 math.modf(x) 返回一个包含小数部分和整数部分的元组。

有人可能会对 math.modf(-2.36) 结果感到好奇,按理说它应该返回 (0.36, 2.00) 才对。这里涉及到了另一个问题,即浮点数在计算机中的表示,在计算机中是无法精确的表示小数的,至少目前的计算机做不到这一点。上例中最后的输出结果只是 0.36 在计算中的近似表示。
Python和C一样, 采用IEEE 754规范来存储浮点数,更详细解释,可以参考知乎话题:
为什么0.1+0.2=0.30000000000000004而1.1+2.2=3.3000000000000003

从官方文档得知,Python中 round(x) 采用银行进位法而非传统的四舍五入。

银行进位规则:
① 如果保留数最后一位不等于5,则执行四舍五入,例如 round(5.234, 2)=5.23 round(5.236, 2)=5.24
② 如果保留数最后一位等于5,则取决于5的位置和状态:⑴ 如果5后有数,不论奇偶都要进位,例如 round(5.2354, 2)=5.24 ;⑵ 如果5后没有数,则需要看5的前一位奇偶性,奇进偶舍,例如 round(5.235, 2)=5.24 , round(5.225, 2)=5.22
但是!注意!:

内心中一片乌鸦飞过,说好的奇进偶舍呢???其实我内心也是奔溃的,继续找答案:
我们都知道,计算机所存储的浮点数并不是表面这么简单,他并不是一个精确值,可以用decimal模块的Decimal对象,将float数据映射为底层的更精确的表示。:

round还是那个round,过错就在于float对象“眼见而非实”上,那到底如何实现真正意义四舍五入呢??
decimal模块是Python的一个标准库,是专门为十进制小数的精确计算而设计的,使用decimal模块的接口,可以实现小数精确的四舍五入,具体不多做展开了,可以参考官方文档...暂时我也用不到decimal
一路写下来,结论就是float心机好深,操作真的要小心点...

❿ python中如何进行开方运算

1、python中使用pow函数求n的n方根。首先打开python的编辑器,新建一个python 3的文件:

热点内容
动态规划01背包算法 发布:2024-11-05 22:17:40 浏览:846
nasm编译器如何安装 发布:2024-11-05 22:01:13 浏览:176
登录密码在微信的哪里 发布:2024-11-05 22:00:29 浏览:735
c防止反编译工具 发布:2024-11-05 21:56:14 浏览:243
安卓虚拟机怎么用 发布:2024-11-05 21:52:48 浏览:340
php时间搜索 发布:2024-11-05 20:58:36 浏览:475
燕山大学编译原理期末考试题 发布:2024-11-05 20:13:54 浏览:524
华为电脑出现临时服务器 发布:2024-11-05 20:05:08 浏览:405
斗战神免费挖矿脚本 发布:2024-11-05 19:53:25 浏览:662
网吧服务器分别是什么 发布:2024-11-05 19:45:32 浏览:389