разбиение числа на целые и десятичные части - PullRequest
71 голосов
/ 13 июля 2011

Есть ли питонический способ разделения числа, такого как 1234.5678, на две части (1234, 0.5678), то есть целочисленная и десятичная части?

Ответы [ 8 ]

116 голосов
/ 13 июля 2011

Использование math.modf:

import math
x = 1234.5678
math.modf(x) # (0.5678000000000338, 1234.0)
53 голосов
/ 13 июля 2011

Мы можем использовать не известную встроенную функцию;divmod:

>>> s = 1234.5678
>>> i, d = divmod(s, 1)
>>> i
1234.0
>>> d
0.5678000000000338
33 голосов
/ 13 июля 2011
>>> a = 147.234
>>> a % 1
0.23400000000000887
>>> a // 1
147.0
>>>

Если вы хотите, чтобы целочисленная часть представляла собой целое число, а не число с плавающей запятой, вместо этого используйте int(a//1). Чтобы получить кортеж за один проход: (int(a//1), a%1)

РЕДАКТИРОВАТЬ: Помните, что десятичная часть числа с плавающей точкой является приблизительной , поэтому, если вы хотите представить его как человек, вам нужно использовать десятичную библиотеку

13 голосов
/ 13 июля 2011
intpart,decimalpart = int(value),value-int(value)

Работает на положительные числа.

6 голосов
/ 02 сентября 2016

Этот вариант позволяет получить желаемую точность:

>>> 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)
3 голосов
/ 20 июля 2017

Это также работает для меня

>>> val_int = int(a)
>>> val_fract = a - val_int
1 голос
/ 04 декабря 2017

Если вы не возражаете против использования 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)
1 голос
/ 23 марта 2016

Вот как я это делаю:

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