python3.5中的地板除问题
对最佳回答进行一些修改:在python3.X中利用/即可直接进行浮点除法运算,即精确除法。而//的规则是:先对被除数进行四舍五入取整(除数不动),然后运算除法,对运算结果进行无条件截断,只保留到整数部分,小数点后不保留。这个类似floor(),所以也叫地板除。
#加粗部分为修改部分
1、用电吹风对着地板的泡沫胶残余,猛吹一通,待泡沫胶加热发软后,轻轻撕下即可。
2、无水酒精擦除法,如果家中有无水酒精,可以找棉球蘸一些无水酒精,来擦除泡沫胶痕迹。如果没有无水酒精,家里的白花油也可以替代。
3、白醋喷洒法,如果家中没有无水酒精,则可以找白醋倒入喷洒壶中,朝着地板的泡沫胶喷,使泡沫胶完全浸湿后,用指甲轻轻一挂便可。
4、橡皮去除法,对于很小块的泡沫胶残余,可以用家里的白橡皮,直接在地板上擦拭,同样可以将泡沫胶去除。
5、牙膏去除法,可以取白色牙膏涂抹在泡沫胶上,然后用干净的湿布慢慢擦除。
123456
>>>1//20>>>1.0//20>>>-1//2.0-1
Python中两个斜杠即双斜杠(//)表示地板除,即先做除法(/),然后向下取整(floor)。至少有一方是float型时,结果为float型;两个数都是int型时,结果为int型。
另外,地板除floor(x)表示不大于x的最大整数,因此不是取整数部分。/
在2.x版本都是这样,会自动取整。
在3.x版本以上改了,结果保留浮点数。系统本身设计就这样的。可以认为是开发python语言的开发者们任性,所以就这样了
附:pyhton中除法的余数
v2.2 以前,除(“/”)运算符的返回有两种可能情况,分别是整型和浮点型。操作数的不同,是影响计算结果数据类型的关键。以 a / b 为例,a、b均为整型,则结果返回整型;a、b任意一个是浮点型的话,则结果就是浮点型。
===========================
# python v2.7
>>> 3 / 2, 3.0 / 2, 3.0 / 2.0
(1, 1.5, 1.5)
===========================
在某些场合,我们可能会期待 a / b 返回浮点型,可是由于某些不确定的因素,参与运算的 a 和 b都是整型,这可能会带来错误,显然有精度上的损失。
v2.2 以后,引入了“地板除”(“//”)运算符,从数值上讲,它返回小于除法运算结果的最大整数;从类型上讲,与"/"运算符返回类型逻辑一致。
而“/”运算符,没有变化。
===========================
# python v2.7
>>> 3 / 2, 3.0 / 2, 3 // 2, 3.0 // 2
(1, 1.5, 1, 1.0)
===========================
v3.x 以后,“/”运算符被命名为“真除”,不再依据操作数类型选择返回值类型,保证计算结果数值上的精度是第一位的。所以,无须再把操作数转变成浮点型,以保证运算结果不被截断小数部分。
“//”运算符,不变。
===========================
# python v3.2
>>> 3 / 2, 3.0 / 2, 3 // 2, 3.0 // 2
(1.5, 1.5, 1, 1.0)
===========================
日常生活中我们在打扫家中卫生的时候常常都会碰到一个难题,怎么样才能把家里地板砖上面的划痕给去除呢?这些划痕很多都是我们日常活动中无意间留下来的,不小心磕碰到或者划伤,甚至有一些已经时日非常久了,日积月累下来可能会造成家里的地板砖变得很难看,影响家中美观。那么我们有没有什么办法可以把这些痕迹去除呢?今天小编久来给大家支一些小妙招,教大家把家中的地板砖痕去除,还我们一个美美的家。
一、牙膏去除法
取牙膏、牙刷,并在印痕处挤少部分牙膏出来。接着用牙刷沾牙膏在划痕处反复刷,相当于在研磨,即反复摩擦,随着研磨时间的增加,划痕印就会逐渐变淡,最后就能消除划痕了。但是此方法并非适合所有划痕印迹的消除,对于浅色瓷砖效果更明显。
二、稀盐酸去除划痕
把盐酸稀释成大约3%的样子(不用太准确),戴上手套,用一张厚纸或抹布沾稀盐酸后轻轻涂抹。等几分钟后用力擦拭。如果不行再抹一次。稀盐酸有腐蚀性。无论是对瓷砖、抹布还是对皮肤都要小心。擦完以后地面必须认真先用水抹几遍再擦干,一定要仔细擦干净,避免盐酸残留的腐蚀性危害到我们日常活动。
三、瓷砖修复法
采用地砖修复剂修复瓷砖划痕,用毛笔沾着修复剂在划痕缝隙处描,30分钟后再涂描一次,干化后再重复一次,一直到从侧面看划痕处有反光,这样处理后可使地砖划痕处保持长期洁净另外深度划伤砖面的划痕也可采用水磨机磨抛,不过要小心磨抛,否则会出现凹坑或砖面更大的破坏,如无光泽、更宽的划痕。
四、使用清洁剂
装修时在地板砖上推理铁架或铝合金,地砖有划痕怎么办,金属推拉的着力点小,压力大,能使金属的痕迹渗入砖面内部,比较难清洗干净,此时为了能够更省力更快速的清除地板上的金属划痕,可以先用清洁剂浸泡3分钟后再擦洗,地砖清洁剂与金属划痕反应分解后会变的松动,用湿毛巾沾着清洁剂稍用力擦拭,洁净如新的砖面立即展现,不会对地板砖表面有影响,光泽不会有任何改变。
以上的小妙招都是针对我们日常家中地板砖出现划痕的一些处理方法,大家可以根据自己家中地板砖的各种不同材质来选择合理的去除方法,早日让家里的地板砖恢复如初。这些方法中如盐酸和清洁剂大家在使用的过程中一定要多加注意,清理的过程中也一定要小心,避免弄伤自己。另外,小编在这里还有一个小小的建议,如果大家像让家中的地板砖减少伤害的话,不妨可以在我们的地板砖上面铺上一层地毯,这样既能避免划伤地板砖产生划痕,也能够起到防滑的作用,一举两得。
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)
div = (vx - mod) / wx
if (mod) {
if ((wx <0) != (mod <0)) {
mod += wx
div -= 1.0
}
}
else {
mod = copysign(0.0, wx)
}
if (div) {
floordiv = floor(div)
if (div - floordiv >0.5)
floordiv += 1.0
}
else {
floordiv = copysign(0.0, 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。
如果要执行整数除法用两个/ ,print(16//2)
如果要当结果是整数时,输出整数,否则输出小数,使用格式符g
print("%g"%(16/2))