floor(-1e-14 % 2)
Out[1]: 1.0
floor(-1e-16 % 2)
Out[2]: 2.0我知道-1e-16可能离0太近了,但是% 2运算后的floor的结果绝不应该是2 (0或1)!
发布于 2017-01-27 00:33:01
这不是%的结果在floor.Check中的错误
In [61]: -1e-16 % 2
Out[61]: 2.0
In [62]: -1e-14 % 2
Out[62]: 1.99999999999999你可以阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic,以了解更多关于%为什么会这样做的信息。
decimal模块提供对十进制浮点算术的支持。与foat数据类型相比,它有几个优点。因此,对于浮点值的精确数学计算
sys.float_info
有关浮点类型的详细信息,可以使用sys.flaot_info。
sys.float_info.dig显示可以在浮点型中如实表示的最大小数位数;对于包含更多位数的计算,您可能不希望在给定精度下得到准确的结果
这就是我得到的
In [217]: import sys
In [218]: sys.float_info.dig
Out[218]: 15发布于 2017-01-27 00:39:40
您说得对,-1e-16的结果不应该是2.0,但是浮点数很奇怪,而且不太精确。%运算符states规范
虽然abs(x%y) < abs(y)在数学上是真的,但对于浮点数,由于舍入,它在数值上可能不是真的。例如,假设平台上的Python浮点数是IEEE 754双精度数,为了使-1e-100% 1e100具有与1e100相同的符号,则计算结果为-1e-100 + 1e100,在数值上恰好等于1e100。函数math.fmod()返回其符号与第一个参数的符号匹配的结果,因此在本例中返回-1e-100。哪种方法更合适取决于应用程序。
https://stackoverflow.com/questions/41878277
复制相似问题