如何获取小数点后的数字?
例如,如果我有5.55
,我如何得到.55
?
如何获取小数点后的数字?
例如,如果我有5.55
,我如何得到.55
?
Answers:
一个简单的方法为您:
number_dec = str(number-int(number))[1:]
number_dec = str(number-int(number)).split('.')[1]
5.55 % 1
它也是一个更通用的答案-一个人可以使用多种语言的模除法,而以上答案是特定于Python的。
.55
)的字符串,由于出现问题标题,您可能不希望该字符串!
str(5.55 - int(5.55))[1:]
返回.5499999999999998
而不是问题中.55
提到的。
5.55 % 1
请记住,这不会帮助您解决浮点舍入问题。即,您可能会得到:
0.550000000001
否则,您的预期值为0.55。
modf
,它也可以提高精度:math.modf(5.55)
将返回(0.5499999999999998,5.0)。
x%1
速度几乎是x-int(x)
和modf(x)[0]
方法的两倍(计时时间为980ns,1.39us和1.47us,平均运行1百万次)。我的价值x
始终是积极的,因此我不必为此担心。
使用modf:
>>> import math
>>> frac, whole = math.modf(2.5)
>>> frac
0.5
>>> whole
2.0
math.modf(2.53) = (0.5299999999999998, 2.0)
预期的答案是0.53
使用decimal
标准库中的模块,您可以保留原始精度并避免浮点舍入问题:
>>> from decimal import Decimal
>>> Decimal('4.20') % 1
Decimal('0.20')
n = 5.55
,则n是一个浮点数,应该这样做Decimal(str(n)) % 1
以获得小数部分。(如果您有整数,则不必这样做,但不会造成伤害。)
10.0/3 % 1
至少在我的系统上
Decimal.from_float(1.2)
(现在可以写成Decimal(1.2)
),则将出现舍入问题,此答案试图避免这一问题。
试试Modulo:
5.55%1 = 0.54999999999999982
类似于公认的答案,使用字符串的更简单方法是
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
?
float
;Python不了解它最初以什么格式表示。我的number = 1e-5
示例同样适用于number = 0.00001
:数字的str
表示形式是科学计数法。你要处理e+
,以及e-
,顺便说一句。
import math
orig = 5.55
whole = math.floor(orig) # whole = 5.0
frac = orig - whole # frac = 0.55
>>> n=5.55
>>> if "." in str(n):
... print "."+str(n).split(".")[-1]
...
.55
有时尾随零很重要
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)
使用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
import math
,为什么不只使用math.modf()
呢?
math.floor(-1.1) == -2
但是int(-1.1) == -1
。虽然对于这个问题,使用int
是更正确的。
import math
x = 1245342664.6
print( (math.floor(x*1000)%1000) //100 )
绝对有效
您可能需要尝试以下方法:
your_num = 5.55
n = len(str(int(your_num)))
float('0' + str(your_num)[n:])
它将返回0.55
。
number=5.55
decimal=(number-int(number))
decimal_1=round(decimal,2)
print(decimal)
print(decimal_1)
输出:0.55
另一种选择是将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的右上方面板中进行说明。如果愿意,您还可以在此链接中观看,它将如何与某些示例输入匹配。
我发现使用模数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')
使用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
您可以使用此:
number = 5.55
int(str(number).split('.')[1])