Python的math模块包含很方便的函数,例如floor
和ceil
。这些函数接受一个浮点数并返回其下面或上面最近的整数。但是,这些函数将答案作为浮点数返回。例如:
import math
f=math.floor(2.3)
现在f
返回:
2.0
如何安全地从该浮点数中获取整数,而不会出现舍入误差的风险(例如,如果浮点数等于1.99999)或者我应该使用另一个函数?
Python的math模块包含很方便的函数,例如floor
和ceil
。这些函数接受一个浮点数并返回其下面或上面最近的整数。但是,这些函数将答案作为浮点数返回。例如:
import math
f=math.floor(2.3)
现在f
返回:
2.0
如何安全地从该浮点数中获取整数,而不会出现舍入误差的风险(例如,如果浮点数等于1.99999)或者我应该使用另一个函数?
int
。只有当您尝试用分母不是2的幂的有理数来表示时,才会出现不精确的表示。使用int(你的非整数数字)
将解决问题。
print int(2.3) # "2"
print int(math.sqrt(5)) # "2"
floor
向下舍入,而int
向0舍入。 - jochenint(-2.3)
并得到了预期的 -2
。整数可以是负数,与正式的数学定义相同。 - srodriguexmath.floor
的结果中得到一个整数,而这个答案展示了如何将浮点数转换为整数。从math.floor
中取出浮点数,然后通过int
进行处理,问题就解决了:int(math.floor(2.3))
。 - JMTylerint(-999999999980/99999999999) == -9 # True
- srodriguex你可以使用round函数。如果不使用第二个参数(表示有效数字的位数),那么你会得到想要的结果。
IDLE输出。
>>> round(2.99999999999)
3
>>> round(2.6)
3
>>> round(2.5)
3
>>> round(2.4)
2
round
函数也会返回一个浮点数。 - Philippround
和floor
都返回整数。因此,我想这个问题涉及到Python 2.x。 - Philippint(round(2.65))
? - teewuaneround(6.5)
的结果是 6?它似乎在小数点后面有一个立即的 5(或更大,最多到 9)时,会类似于 ceil()
函数般将浮点数向上取整。为什么在这种情况下,或者任何以六结尾且小数点后面紧跟着 5 的情况下,这种方法都不起作用呢? - candh结合之前的两个结果,我们有:
int(round(some_float))
这可以可靠地将浮点数转换为整数。
int
类型所能承载的更大数值的 float
。在 Python 2 中,是否有一些 float
值,只能使用 long
(经过四舍五入后)来表示? - Agostinoint()
函数根据需要生成int
或long
。 - kralyk 1 bit 11 / 8 52 / 23 # bits double/single precision
[ sign | exponent | mantissa ]
根据以下公式计算数字(不包括在此无关紧要的特殊情况):
-1sign × 1.mantissa ×2exponent - bias
其中 bias = 2exponent - 1 - 1,即双精度和单精度分别为1023和127。
知道乘以2X只需将所有位向左移X个位置,很容易看出任何整数必须使小数点右侧的所有位都为零。
除零之外的任何整数在二进制中都具有以下形式:
1x...x 其中 x 表示 MSB(最高有效位)右侧的位。
因为我们排除了零,所以始终会有一个 MSB 的值为1-这就是为什么它没有被存储。为了存储整数,我们必须将其带入上述格式:-1sign × 1.mantissa ×2exponent - bias。
这相当于将位数移到小数点处,直到只剩下 MSB 在左侧。小数点右侧的所有位都存储在尾数中。
由此可以看出,除了 MSB 之外,我们最多可以存储52个二进制数字。
因此,所有位都明确存储的最大数字为
111(omitted)111. that's 53 ones (52 + implicit 1) in the case of doubles.
为此,我们需要设置指数,使十进制点向右移动52位。如果我们将指数增加1,就无法知道小数点左侧的数字。
111(omitted)111x.
按照惯例,应为0。将整个尾数设为零,我们得到以下数字:
100(omitted)00x. = 100(omitted)000.
这是一个1后面跟着53个零的数字,其中52个存储在位数中,1个由于指数而添加。
它表示253,它标志着我们可以准确表示所有整数的边界(负和正)。如果我们想要将253加1,则必须将隐式零(由x
表示)设置为1,但这是不可能的。
如果您需要将字符串浮点数转换为整数,可以使用此方法。
例如:'38.0'
转换为 38
为了将其转换为整数,您可以将其强制转换为浮点数,然后再转换为整数。这也适用于浮点字符串或整数字符串。
>>> int(float('38.0'))
38
>>> int(float('38'))
38
注意:这将去除小数点后的任何数字。
>>> int(float('38.2'))
38
math.floor
会始终返回一个整数,因此int(math.floor(some_float))
永远不会引入四舍五入误差。
然而,在math.floor(some_large_float)
中可能已经引入了舍入误差,甚至在首次将大数字存储为浮点数时也可能出现这种情况(当存储大数字时,浮点数可能会失去精度)。
int
和floor
返回不同的值。 - user3850既然你要求“最安全”的方式,那我提供另一个答案,不同于排名第一的答案。
确保不丢失任何精度的简便方法是在转换后检查这些值是否相等。
if int(some_value) == some_value:
some_value = int(some_value)
例如,如果浮点数是1.0,那么1.0等于1。这时转换为整数执行。而如果浮点数是1.1,则int(1.1)等于1,1.1!= 1。因此,该值将保持浮点数,不会丢失任何精度。
以下是一个代码示例,使用变量将实数/浮点数转换为整数。 "vel" 是一个实数/浮点数,并转换为最接近的整数,"newvel"。
import arcpy.math, os, sys, arcpy.da
.
.
with arcpy.da.SearchCursor(densifybkp,[floseg,vel,Length]) as cursor:
for row in cursor:
curvel = float(row[1])
newvel = int(math.ceil(curvel))
math.floor
在Python 2.6中返回浮点数,但在Python 3中返回整数。目前距离初始帖子已经六年了,这个问题可能很少出现。 - sancho.s ReinstateMonicaCellio