如何获取小数点后的数字?

184

如何获取小数点后的数字?

例如,如果有 5.55,如何获取 .55


2
相关问题:在Python中如何通过小数点拆分数字? - ire_and_curses
我认为你应该更改这个问题的被采纳答案。我差点没有往下滚动查看得到获得10倍投票的答案,这可能会在以后给我带来麻烦。 - Gulzar
我认为这是一个简单的方法:float( '0.' + str(5.55).split('.')[1] ) >>> 0.55。但如果有人有不同的想法,请告诉我。 - Abimael Domínguez
38个回答

279
5.55 % 1

注意,这并不能帮助你解决浮点数舍入问题。例如,你可能会得到:

0.550000000001

或者说,可能会偏离你期望的 0.55。


10
关于modf,它也可能影响精度:math.modf(5.55)将返回(0.5499999999999998, 5.0)。 - bereal
3
有人知道哪种操作更快吗?是上面描述的方法还是float b = a - int(a)?我觉得后者更快,但想知道是否有确认。 - hokkuk
9
在树莓派上,这种方法 x%1 的速度几乎是 x-int(x)modf(x)[0] 方法的两倍(1000000次运行的平均时间分别为980纳秒、1.39微秒和1.47微秒)。我的变量 x 始终为正值,所以我不必担心这个问题。 - coderforlife
7
注意,这会在负数上出错。 - M. Lautaro
1
@M.Lautaro 这取决于您对负数的行为要求。例如,对于“-2.5”,您希望算法返回“-0.5”还是“0.5”?OP没有指定。对于我的用例,我可以接受前者,所以这很好用。 - eric
显示剩余8条评论

203

使用modf函数:

>>> import math
>>> frac, whole = math.modf(2.5)
>>> frac
0.5
>>> whole
2.0

7
好的解决方案,但是 math.modf(2.53) = (0.5299999999999998, 2.0),期望的答案是0.53。 - Lord Loh.
14
这是由于浮点数舍入导致的,任何方法都会出现这种情况。 - Rena
1
@LordLoh。尝试使用round(0.5299999999999998, 2)来获取0.53。另一种方法是使用decimal包中的Decimal。https://docs.python.org/2/library/decimal.html - SirJ
3
更准确地说:"......并且对于任何需要以IEEE 754双精度浮点数形式给出结果的方法都会发生这种情况。" - Evgeni Sergeev

83

那么这个怎么样:

a = 1.3927278749291
b = a - int(a)

b
>> 0.39272787492910011

或者,使用numpy:

import numpy
a = 1.3927278749291
b = a - numpy.fix(a)

43

使用标准库中的decimal模块,您可以保留原始精度并避免浮点数舍入问题:

>>> from decimal import Decimal
>>> Decimal('4.20') % 1
Decimal('0.20')

正如kindall评论中所指出的,你需要首先将原始的float类型转换为字符串。


为了方便提问者:在将浮点数转换为十进制数之前,必须将其转换为字符串。因此,如果您有 n = 5.55,其中 n 是一个浮点数,则应该执行 Decimal(str(n)) % 1 来获取小数部分。(如果您有一个整数,则不需要这样做,但这并不会有任何影响。) - kindall
2
@intuited:它不需要是十进制,它也适用于浮点数:10.0/3 % 1,至少在我的系统上。 - aherok
3
您可以使用 from_float 方法来代替使用字符串进行初始化。例如:d = Decimal.from_float(1.2)。 - Matthew Purdon
@intuited 如何将小数部分转换为整数?我尝试过使用to_integer()方法,但类型仍然为Decimal。 - D1X
4
如果你使用Decimal.from_float(1.2)(现在可以写成Decimal(1.2)),会出现舍入问题,而这个答案是试图避免这种情况的。 - John Y
@D1X 现在,当在 decimal.Decimal 对象上使用 math.floormath.ceil 时,它们将返回一个 int 类型的值。我认为这是 Python 2 和 3 之间的一个变化。例如,math.floor(decimal.Decimal('4.90')) 返回 4math.floor(decimal.Decimal('-4.90')) 返回 -5,而 type(math.floor(decimal.Decimal('-4.90')))<class 'int'> - undefined

31
一个简单的方法:
number_dec = str(number-int(number))[1:]

41
读者练习:使其适用于大于或等于10的数字。 - intuited
11
number_dec = str(number-int(number)).split('.')[1] - Ryan Allen
43
因为这种方法过于复杂,所以我给它投了反对票。我想要的答案是下一个答案 5.55 % 1 ,它也是一个更常用的答案——人们可以在多种编程语言中使用模除法,而上面的答案是针对Python特定的。 - Stew
3
注意:由于问题标题,此解决方案返回包含小数点(".55")的字符串,这可能不是您所期望的! - T. Christiansen
16
str(5.55 - int(5.55))[1:]返回的结果是.5499999999999998,而不是问题中提到的.55 - Cristian Ciupitu
显示剩余9条评论

10

尝试使用模运算:

5.55%1 = 0.54999999999999982

10
为了让它适用于正数和负数,请尝试使用abs(x)%1。 对于负数,如果没有使用abs,结果会有误差。 5.55 % 1 输出0.5499999999999998 -5.55 % 1 输出0.4500000000000002

6
import math
orig = 5.55
whole = math.floor(orig)    # whole = 5.0
frac = orig - whole         # frac = 0.55

frac 0.5499999999999998
- macm

5
类似于接受的答案,更简单的方法是使用字符串。
def number_after_decimal(number1):
    number = str(number1)
    if 'e-' in number: # scientific notation
        number_dec = format(float(number), '.%df'%(len(number.split(".")[1].split("e-")[0])+int(number.split('e-')[1])))
    elif "." in number: # quick check if it is decimal
        number_dec = number.split(".")[1]
    return number_dec

number = 5.55; "." in number会出现TypeError: argument of type 'float' is not iterable错误。如果number = 1e-5,你会怎么做? - Mark Dickinson
@mark 这个问题是如何获取小数点后面的数字?所以用户期望使用小数表示浮点数(而不是科学计数法),我也添加了一个用于科学计数法的代码块。 - yosemite_k
一个数字就是一个数字,只有_表示_数字的方式可能以科学计数法表示。因此,“十进制小数中的浮点数”在这里并没有太多意义;当Python看到它时,它只是一个float;Python不会保留任何原始表达格式的知识。我的number = 1e-5示例同样适用于number = 0.00001:该数字的str表示是用科学计数法表示的。顺便说一下,您还需要处理e+e- - Mark Dickinson

4

只需使用简单的运算符除法'/'地板除法'//',您就可以轻松获取任何给定浮点数的小数部分。

number = 5.55

result = (number/1) - (number//1)

print(result)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接