如何获得小数点后的数字?
Posted
技术标签:
【中文标题】如何获得小数点后的数字?【英文标题】:How to get numbers after decimal point? 【发布时间】:2011-04-22 15:10:58 【问题描述】:例如,如果我有5.55
,我如何获得.55
?
【问题讨论】:
相关:In Python how do I split a number by the decimal point? 我认为您应该更改已接受的答案。我几乎没有向下滚动到 x10 次投票的答案,这会在以后咬我。 我认为这是一个简单的方法:float( '0.' + str(5.55).split('.')[1] )
>>> 0.55。但如果有人认为不同,请告诉我。
【参考方案1】:
怎么样:
a = 1.3927278749291
b = a - int(a)
b
>> 0.39272787492910011
或者,使用 numpy:
import numpy
a = 1.3927278749291
b = a - numpy.fix(a)
【讨论】:
【参考方案2】:5.55 % 1
请记住,这不会帮助您解决浮点舍入问题。即,您可能会得到:
0.550000000001
否则会与您预期的 0.55 稍有偏差。
【讨论】:
至于modf
,它也可以拧紧精度:math.modf(5.55)
将返回 (0.5499999999999998, 5.0)。
有谁知道哪个是更快的操作,上面描述的这种方法,或者:float b = a - int(a) ?我怀疑是后者,但想看看是否有确认
在 Raspberry Pi 上,此方法 x%1
的速度几乎是 x-int(x)
和 modf(x)[0]
方法的两倍(时间分别为 980ns、1.39us 和 1.47us,平均超过 1000000 次运行)。我对x
的价值始终是积极的,所以我不必担心。
模块操作肯定更快。它不必进行任何名称查找。而调用 int 函数会查找全局变量。
当心这打破了负数。【参考方案3】:
尝试模数:
5.55%1 = 0.54999999999999982
【讨论】:
【参考方案4】:import math
orig = 5.55
whole = math.floor(orig) # whole = 5.0
frac = orig - whole # frac = 0.55
【讨论】:
>>> frac 0.5499999999999998【参考方案5】:使用 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()
?
@ire_and_curses:我正在为该问题提供替代解决方案。
floor 与转换为 int 的作用相同,因此可以将 math.floor(t) 替换为 int(t)
@QuantumKarl 不,它们是不同的。 math.floor(-1.1) == -2
但int(-1.1) == -1
。虽然对于这个问题使用int
更正确。【参考方案6】:
使用标准库中的decimal
模块,您可以保留原始精度并避免浮点舍入问题:
>>> from decimal import Decimal
>>> Decimal('4.20') % 1
Decimal('0.20')
作为 cmets 中的 kindall notes,您必须先将原生 float
s 转换为字符串。
【讨论】:
为了原始提问者的利益:浮点数必须先转换为字符串,然后才能转换为小数。所以如果你有n = 5.55
,n 是一个浮点数,你应该用Decimal(str(n)) % 1
得到小数部分。 (如果你有一个整数,这不是必需的,但它不会伤害。)
@intuited:它不需要是十进制,它也适用于浮点数:10.0/3 % 1
至少在我的系统上
您可以使用 from_float 代替字符串。 d = Decimal.from_float(1.2)
@intuited 如何获得整数的小数部分?我尝试过 to_integer() 方法,但类型仍然是 Decimal。
@MatthewPurdon - 如果你使用Decimal.from_float(1.2)
(现在可以写成Decimal(1.2)
)你会遇到四舍五入的问题,这个答案试图避免。【参考方案7】:
>>> n=5.55
>>> if "." in str(n):
... print "."+str(n).split(".")[-1]
...
.55
【讨论】:
这对于普通数字来说是可以的,但对于大到(或小)到需要科学记数法的数字来说效果不佳。【参考方案8】:一种简单的方法:
number_dec = str(number-int(number))[1:]
【讨论】:
读者练习:使其适用于大于或等于 10 的数字number_dec = str(number-int(number)).split('.')[1]
投反对票,因为这是一种不必要的复杂方法。我寻求的答案是下一个答案5.55 % 1
,这也是一个更普遍有用的答案——可以在多种语言中使用模除法,而上述答案是特定于 Python 的。
注意:此解决方案返回一个包含点 (.55
) 的字符串,由于问题标题,您可能不会想到!
str(5.55 - int(5.55))[1:]
返回.5499999999999998
,而不是问题中提到的.55
。【参考方案9】:
另一个疯狂的解决方案是(不转换为字符串):
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
【讨论】:
【参考方案10】:使用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
@LordLoh。这是因为浮点舍入,任何方法都会发生。
@LordLoh。尝试使用 round(0.5299999999999998 , 2) 得到 0.53 另一种方法是使用十进制包中的十进制。 docs.python.org/2/library/decimal.html
@Rena 更准确地说:“......并且对于必须以 IEEE 754 双精度浮点数形式给出结果的任何方法都会发生。”【参考方案11】:
这是我尝试过的解决方案:
num = 45.7234
(whole, frac) = (int(num), int(str(num)[(len(str(int(num)))+1):]))
【讨论】:
【参考方案12】:怎么样:
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 的第二个参数。
【讨论】:
有什么解释吗?【参考方案13】:例子:
import math
x = 5.55
print((math.floor(x*100)%100))
这将为您提供小数点后的两个数字,即该示例中的 55。如果您需要一个数字,则将上述计算减少 10 或增加,具体取决于您想要小数点后的数字。
【讨论】:
这很好,因为它返回一个非小数值,但会在负数上中断 不幸的是,它大部分时间都不起作用。 @喵喵【参考方案14】:类似于公认的答案,使用字符串更简单的方法是
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 问题是如何获得小数点后的数字?所以用户期望浮点数以十进制表示(不是科学计数法),我也为科学计数法添加了一个块
一个数字就是一个数字;它只是可能以科学记数法表示的数字的表示。所以“十进制浮点数”在这里没有多大意义;当 Python 看到它时,它只是一个float
; Python 不知道它最初用什么格式表示。我的number = 1e-5
示例同样适用于number = 0.00001
:str
数字的表示形式是科学计数法。顺便说一句,您需要处理 e+
和 e-
。【参考方案15】:
浮点数不以十进制 (base10) 格式存储。阅读python documentation 以了解原因。因此,不建议从浮点数中获取 base10 表示。
现在有一些工具允许以十进制格式存储数字数据。下面是使用Decimal
库的示例。
from decimal import *
x = Decimal('0.341343214124443151466')
str(x)[-2:] == '66' # True
y = 0.341343214124443151466
str(y)[-2:] == '66' # False
【讨论】:
【参考方案16】:有时尾随零很重要
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 有什么作用?【参考方案17】:import math
x = 1245342664.6
print( (math.floor(x*1000)%1000) //100 )
确实有效
【讨论】:
运算符//是什么意思?【参考方案18】:你可能想试试这个:
your_num = 5.55
n = len(str(int(your_num)))
float('0' + str(your_num)[n:])
它将返回0.55
。
【讨论】:
【参考方案19】:number=5.55
decimal=(number-int(number))
decimal_1=round(decimal,2)
print(decimal)
print(decimal_1)
输出:0.55
【讨论】:
【参考方案20】:看看我经常在python中获取小数点后的数字 3:
a=1.22
dec=str(a).split('.')
dec= int(dec[1])
【讨论】:
【参考方案21】:如果您使用的是熊猫:
df['decimals'] = df['original_number'].mod(1)
【讨论】:
【参考方案22】:另一种选择是将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 的右上角面板中已对此进行了说明。如果您愿意,您还可以在this link 中观看它如何与一些示例输入匹配。
来源
How to get rid of additional floating numbers in python subtraction?
【讨论】:
【参考方案23】:我发现在使用模 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')
【讨论】:
【参考方案24】:另一个使用 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
【讨论】:
【参考方案25】:一种解决方案是使用模数和舍入。
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
【讨论】:
【参考方案26】:只需使用简单的运算符 division '/' 和 floor division '//',您就可以轻松获得任何给定浮点数的小数部分。
number = 5.55
result = (number/1) - (number//1)
print(result)
【讨论】:
【参考方案27】:你可以用这个:
number = 5.55
int(str(number).split('.')[1])
【讨论】:
【参考方案28】:这只是你想得到第一个小数
print(int(float(input()) * 10) % 10)
或者你可以试试这个
num = float(input())
b = num - int(num)
c = b * 10
print(int(c))
【讨论】:
【参考方案29】:def fractional_part(numerator, denominator):
if denominator == 0:
return 0
else:
return numerator / denominator - numerator // denominator
print(fractional_part(5, 5)) # Should be 0
print(fractional_part(5, 4)) # Should be 0.25
print(fractional_part(5, 3)) # Should be 0.66...
print(fractional_part(5, 2)) # Should be 0.5
print(fractional_part(5, 0)) # Should be 0
print(fractional_part(0, 5)) # Should be 0
【讨论】:
【参考方案30】:使用数学模块
这个速度有待测试
from math import floor
def get_decimal(number):
'''returns number - floor of number'''
return number-floor(number)
例子:
n = 765.126357123
get_decimal(n)
0.12635712300004798
【讨论】:
可以测试速度:from timeit import timeit iterations = 1000000 result = timeit( 'n = 765.126357123; x = n -floor(n)', 'from math import floor', number=iterations ) print("Total time was:", result) print("Time per iterations was:", result/iterations)
以上是关于如何获得小数点后的数字?的主要内容,如果未能解决你的问题,请参考以下文章