Python中math.floor()与//运算符的实现差异及结果不同问题
math.floor() 与 // 运算符的结果差异原因
先看测试代码:
import math def try_floor(): return math.floor(47642706656219667964201 / 2) def try_double_backslash(): return 47642706656219667964201 // 2
两个函数返回结果不同,核心原因是两者依赖的运算机制和精度完全不同:
// 运算符:精确整数除法
Python的int类型是任意精度的,不管整数多大都能精确存储。a // b直接对两个整数执行向负无穷方向取整的整数除法,全程不会丢失任何精度。测试用的大整数47642706656219667964201能被Python精确存储,// 2自然能算出精确的商23821353328109833982100。math.floor():基于浮点数的近似运算
代码里用了/除法,这会先把整数转换为双精度浮点数(float)。但双精度浮点数的有效位数只有53位,测试用的整数远大于2^53(约9×10¹⁵),转成float时,低位的精确信息会被丢弃,变成一个近似值。原数转成float后已经不是原来的精确值了,除以2后的结果也是近似值,math.floor()只是对这个失真的浮点数取整,最终得到23821353328109835780096这个和精确结果不同的值。
简单说://走的是精确整数运算逻辑,math.floor(/)依赖的是浮点数近似运算,大数场景下浮点数精度不够,结果自然不一样。
内容的提问来源于stack exchange,提问作者Stephane. T NOUAFFO
相关产品推荐
相关产品推荐

