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


Answers:


29

一个简单的方法为您:

number_dec = str(number-int(number))[1:]

30
读者练习:使其适用于大于或等于10的数字
2013年

11
number_dec = str(number-int(number)).split('.')[1]
Ryan Allen

28
赞成投票,因为这是不必要的复杂方法。我寻求的答案是下一个答案,5.55 % 1它也是一个更通用的答案-一个人可以使用多种语言的模除法,而以上答案是特定于Python的。

3
注意:此解决方案返回一个包含点(.55)的字符串,由于出现问题标题,您可能不希望该字符串!
T. Christiansen

8
str(5.55 - int(5.55))[1:]返回.5499999999999998而不是问题中.55提到的。
Cristian Ciupitu

198
5.55 % 1

请记住,这不会帮助您解决浮点舍入问题。即,您可能会得到:

0.550000000001

否则,您的预期值为0.55。


7
至于modf,它也可以提高精度:math.modf(5.55)将返回(0.5499999999999998,5.0)。
Bereal 2012年

1
有谁知道更快的操作,上述方法或以下方法:float b = a-int(a)?我怀疑稍后,但想查看是否有确认
hokkuk 2012年

4
在Raspberry Pi上,此方法的x%1速度几乎是x-int(x)modf(x)[0]方法的两倍(计时时间为980ns,1.39us和1.47us,平均运行1百万次)。我的价值x始终是积极的,因此我不必为此担心。
coderforlife

绝对是模块运行更快。它不必进行任何名称查找。而调用int函数会对全局变量进行查找。
恩里科·博尔巴

幻想不仅拥有frac()
mckenzm

155

使用modf

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

2
好的解决方案,但math.modf(2.53) = (0.5299999999999998, 2.0)预期的答案是0.53
卢勋爵。

4
@LordLoh。那是因为浮点数舍入,并且任何方法都会发生。
Rena

@LordLoh。尝试使用round(0.5299999999999998,2)获得0.53的另一种方法是从十进制包中使用Decimal。docs.python.org/2/library/decimal.html
SirJ,

57

关于什么:

a = 1.3927278749291
b = a - int(a)

b
>> 0.39272787492910011

或者,使用numpy:

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

33

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

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

注释中的kindall 注释所示,您必须首先将native转换为字符串。float


为了原始提问者的利益:必须先将浮点数转换为字符串,然后才能将其转换为十进制数。因此,如果您有n = 5.55,则n是一个浮点数,应该这样做Decimal(str(n)) % 1以获得小数部分。(如果您有整数,则不必这样做,但不会造成伤害。)
kindall

2
@intuited:不必为小数,它也适用于float:10.0/3 % 1至少在我的系统上
aherok 2013年

2
您可以使用from_float而不是字符串。d = Decimal.from_float(1.2)
马修·

@intuited如何获得小数部分作为整数?我尝试了to_integer()方法,但是类型仍然是Decimal。
D1X

1
@MatthewPurdon-如果使用Decimal.from_float(1.2)(现在可以写成Decimal(1.2)),则将出现舍入问题,此答案试图避免这一问题。
John Y


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 numberTypeError: argument of type 'float' is not iterable。如果要怎么办number = 1e-5
马克·迪金森

@mark问题是如何获取小数点后的数字?因此用户期望以十进制表示法(不是科学计数法)进行浮点运算,所以我也添加了一个科学计数法的块
yosemite_k

数字就是数字;它只是可能以科学计数法表示的数字的表示形式。因此,“以十进制表示法浮动”在这里没有多大意义。到Python看到的时候,它只是一个float;Python不了解它最初以什么格式表示。我的number = 1e-5示例同样适用于number = 0.00001:数字的str表示形式是科学计数法。你要处理e+,以及e-,顺便说一句。
马克·迪金森


4
>>> n=5.55
>>> if "." in str(n):
...     print "."+str(n).split(".")[-1]
...
.55

2
这对于各种花园数字是可以的,但对于足够大(或小)以至于需要科学计数法的数字,效果并不理想。
kindall 2010年

2

这是我尝试过的解决方案:

num = 45.7234
(whole, frac) = (int(num), int(str(num)[(len(str(int(num)))+1):]))

2

有时尾随零很重要

In [4]: def split_float(x):
   ...:     '''split float into parts before and after the decimal'''
   ...:     before, after = str(x).split('.')
   ...:     return int(before), (int(after)*10 if len(after)==1 else int(after))
   ...: 
   ...: 

In [5]: split_float(105.10)
Out[5]: (105, 10)

In [6]: split_float(105.01)
Out[6]: (105, 1)

In [7]: split_float(105.12)
Out[7]: (105, 12)

这对于0.000005有什么作用?
Aditya Patnaik

1

使用floor并从原始数字中减去结果:

>> import math #gives you floor.
>> t = 5.55 #Give a variable 5.55
>> x = math.floor(t) #floor returns t rounded down to 5..
>> z = t - x #z = 5.55 - 5 = 0.55

5
如果您要去import math,为什么不只使用math.modf()呢?
ire_and_curses

@ire_and_curses:我正在提供该问题的替代解决方案。

1
floor与强制转换为int相同,因此可以将int(t)替换为math.floor(t)
QuantumKarl 2013年

@QuantumKarl不,他们是不同的。math.floor(-1.1) == -2但是int(-1.1) == -1。虽然对于这个问题,使用int是更正确的。
Lambda Fairy

1

浮点数不会以十进制(base10)格式存储。阅读有关此内容的python文档,以了解为什么。因此,建议不要从浮点数中获取base10表示形式。

现在有一些工具允许以十进制格式存储数字数据。以下是使用该Decimal库的示例。

from decimal import *

x = Decimal('0.341343214124443151466')
str(x)[-2:] == '66'  # True

y = 0.341343214124443151466
str(y)[-2:] == '66'  # False

1

例:

import math
x = 5.55
print((math.floor(x*100)%100))

这将为您提供小数点后的两个数字,即本例中的55。如果需要一个数字,则将上述计算结果减少10或增加,具体取决于小数点后要多少个数字。


很好,因为它返回的是非小数值,但是会在负数上中断
喵喵

不幸的是,它在大多数情况下都不起作用。@喵
洛恩侯爵


1

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

number = 5.55

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

print(result)

0

关于什么:

a = 1.234
b = a - int(a)
length = len(str(a))

round(b, length-2)

输出:
print(b)
0.23399999999999999
round(b, length-2)
0.234

由于该回合被发送到小数点字符串的长度(“ 0.234”),因此我们可以减去2而不计算“ 0”,并找出所需的小数点位数。除非您有很多小数位,并且计算b时的舍入误差会干扰round的第二个参数,否则这应该通常可以工作。


有什么解释吗?


0
number=5.55
decimal=(number-int(number))
decimal_1=round(decimal,2)
print(decimal)
print(decimal_1)

输出:0.55


0

看看我在python 3小数点后经常获取数字的方法:

a=1.22
dec=str(a).split('.')
dec= int(dec[1])


0

另一种选择是将re模块与re.findall或一起使用re.search

import re


def get_decimcal(n: float) -> float:
    return float(re.search(r'\.\d+', str(n)).group(0))


def get_decimcal_2(n: float) -> float:
    return float(re.findall(r'\.\d+', str(n))[0])


def get_int(n: float) -> int:
    return int(n)


print(get_decimcal(5.55))
print(get_decimcal_2(5.55))
print(get_int(5.55))

输出量

0.55
0.55
5

如果您希望简化/修改/探索该表达式,请在regex101.com的右上方面板中进行说明。如果愿意,您还可以在此链接中观看,它将如何与某些示例输入匹配。


资源

如何在python减法中摆脱其他浮点数?


0

我发现使用模数1求分数时,分数部分很大的大量数会引起问题。

import decimal

>>> d = decimal.Context(decimal.MAX_PREC).create_decimal(
... '143000000000000000000000000000000000000000000000000000000000000000000000000000.1231200000000000000002013210000000'
... )
...
>>> d % 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
decimal.InvalidOperation: [<class 'decimal.DivisionImpossible'>]

相反,我抓住了不可分割的部分并先减去了它,以帮助简化其余部分。

>>> d - d.to_integral()
Decimal('0.1231200000000000000002013210')

0

使用modf的另一个示例

from math import modf
number = 1.0124584

# [0] decimal, [1] integer
result = modf(number)
print(result[0])
# output = 0124584
print(result[1])
# output = 1

0

一个解决方案是使用模和舍入。

import math

num = math.fabs(float(5.55))
rem = num % 1

rnd_by =   len(str(num)) - len(str(int(num))) - 1

print(str(round(rem,rnd_by)))

您的输出将是0.55



-2

另一个疯狂的解决方案是(不转换为字符串):

number = 123.456
temp = 1

while (number*temp)%10 != 0:
    temp = temp *10
    print temp
    print number

temp = temp /10
number = number*temp
number_final = number%temp
print number_final
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.