2011-07-13 329 views

回答

82
import math 
x = 1234.5678 
math.modf(x) # (0.5678000000000338, 1234.0) 
+1

完美!与负面效果很好!谢谢 –

+1

应用math.modf(x)后,我该如何处理结果值?例如,如果我将1234.0分配给一个变量,我该怎么做? – hakiko

+1

dec,int = math.modf(1234.5678) – gbtimmon

22
>>> a = 147.234 
>>> a % 1 
0.23400000000000887 
>>> a // 1 
147.0 
>>> 

如果你想的整数部分为整数,而不是一个浮点数,使用int(a//1)代替。为了获得元组在一个单一的通道:(int(a//1), a%1)

编辑:请记住,the decimal part of a float number is approximate,所以如果你想表示它作为一个人会做,你需要使用decimal library

+3

对负数“-2.25 // 1 == -3.0”和“-2.25%1 == 0.75”的结果稍有混淆。这可能是OP想要的,因为int部分+小数部分仍然等于原始值。相反,'math.modf(-2.25)==(-0.25,-2.0)'。 –

+0

@安德鲁 - 好点!无论如何,我认为@ mhyfritz的答案是一个更好的答案! – mac

+0

不错的 - 我认为这将是这里显示的最快的方法铭记安德鲁克拉克负数的警告 – jacanterbury

13
intpart,decimalpart = int(value),value-int(value) 

Works为正数。

+0

'In [1]:value = 1.89' '在[2]:intpart,decimalpart = int(value ),值INT(值)' '在[3]:intpart' '缺货[3]:1' '在[4]:decimalpart' '缺货[4]:0.8899999999999999' – iMom0

+1

@ iMom0 - 请参阅http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html以及本网站上有关浮点精度的许多问题。 –

43

我们可以使用一个不着名的内置函数; divmod:

>>> s = 1234.5678 
>>> i, d = divmod(s, 1) 
>>> i 
1234.0 
>>> d 
0.5678000000000338 
+3

为负数提供可能不直观的结果:'divmod(-4.5,1)'给出-5.0和0.5。使用'divmod(-4.5,-1)'给出4.0和-0.5。 – Holloway

2

这是我的方式做到这一点:

num = 123.456 
split_num = str(num).split('.') 
int_part = int(split_num[0]) 
decimal_part = int(split_num[1]) 
+4

根据使用情况,这可能不适用于小数点后为零的数字(例如123.0456) – Jon

+0

您是对的:它取决于用例。如果你用123.0456尝试它,结果是int_part = 123和decimal_part = 456.在我的用例中,我发现“清零”有用:) – holydrinker

5

这种形式允许得到所需的精确度:

>>> a = 1234.5678 
>>> (lambda x, y : (int(x), int(x * y) % y/y))(a, 1e0) 
(1234, 0.0) 
>>> (lambda x, y : (int(x), int(x * y) % y/y))(a, 1e1) 
(1234, 0.5) 
>>> (lambda x, y : (int(x), int(x * y) % y/y))(a, 1e15) 
(1234, 0.5678) 
1

这也为我的作品

>>> val_int = int(a) 
>>> val_fract = a - val_int 
1

如果您不介意使用NumPy,则:

In [319]: real = np.array([1234.5678]) 

In [327]: integ, deci = int(np.floor(real)), np.asscalar(real % 1) 

In [328]: integ, deci 
Out[328]: (1234, 0.5678000000000338) 
相关问题