숫자를 정수와 소수 부분으로 나누기


91

정수 부분과 소수 부분 과 같이 숫자 1234.5678를 두 부분 으로 나누는 비단뱀적인 방법이 (1234, 0.5678)있습니까?

답변:


142

사용 math.modf:

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

2
완전한! 네거티브와도 잘 작동합니다! 감사합니다
Double AA

1
math.modf (x) 적용 후 결과 값을 어떻게 처리 할 수 ​​있습니까? 예를 들어 변수에 1234.0을 지정하면 어떻게 할 수 있습니까?
hakiko

3
하는 dec INT = math.modf (1234.5678)
gbtimmon

17
int변수 이름으로 사용하지 마십시오 int. 함수 를 재정의합니다 .
Holloway

2
@Trengot- int_소리내어 읽을 때 "int"라고하는 변수가 있어야하는 경우 사용 합니다.
ArtOfWarfare 2015-06-23

61

유명하지 않은 내장 함수를 사용할 수 있습니다. divmod :

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

4
음수에 대해 직관적이지 않은 결과를 divmod(-4.5,1)제공합니다. -5.0 및 0.5를 제공합니다. 사용 divmod(-4.5, -1)하면 4.0과 -0.5가됩니다.
Holloway

@Holloway 그것은 직관적이지 않고 수학 규칙에서 비롯됩니다 : en.wikipedia.org/wiki/Floor_and_ceiling_functions :)
Sviatoslav V.

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

정수 부분을 실수가 아닌 정수로 사용하려면 int(a//1)대신 사용하십시오. 단일 구절에서 튜플을 얻으려면 :(int(a//1), a%1)

편집 : float 숫자의 소수 부분은 근사치 이므로 사람처럼 표현하려면 소수 라이브러리 를 사용해야합니다.


4
음수에 대한 약간 혼란스러운 결과 -2.25 // 1 == -3.0-2.25 % 1 == 0.75. 정수 부분 + 소수 부분이 여전히 원래 값과 같기 때문에 이것은 OP가 원하는 것일 수 있습니다. 대조적으로 math.modf(-2.25) == (-0.25, -2.0).
Andrew Clark

@ Andrew-좋은 지적! 나는 @mhyfritz의 대답이 어쨌든 더 나은 것이라고 생각합니다!
mac



7

이 변형을 사용하면 원하는 정밀도를 얻을 수 있습니다.

>>> 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)

4

이것은 또한 나를 위해 작동합니다

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

0

이것이 내가하는 방법입니다.

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

4
사용 사례에 따라 소수 자리 뒤에 0이있는 숫자 (예 : 123.0456)에는 작동하지 않을 것입니다.
Jon

당신 말이 맞습니다 : 사용 사례에 따라 다릅니다. 123.0456으로 시도하면 결과는 int_part = 123이고 decimal_part = 456입니다. 내 사용 사례에서 "제로 제거"가 유용하다는 것을 발견했습니다. :)
holydrinker

0

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)

0

몇 가지 답변을 살펴본 후. 정확성을 손상시키지 않고 양수와 음수를 정수와 분수로 나눌 수있는이 두 가지 진술을 생각해 냈습니다. 성능 테스트는 두 개의 새로운 명령문이 math.modf자체 함수 또는 메소드에 포함되지 않는 한보다 빠르다는 것을 보여줍니다 .

i = int(x) # i contains a positive or negative integer
f = (x*1e17-i*1e17)/1e17 # f contains a positive or negative fraction

100.1323-> 100, 0.1323-100.1323 ->-100, -0.1323

테스트 스크립트 :

#!/usr/bin/env python
import math
import cProfile

""" Get the performance of both statements vs math.modf. """

X = -100.1323
LOOPS = range(5*10**6)

def fun_a():
    """ The integer part (i) is an integer, and
        the fraction part (f) is a float.
        NOTE: I think this is the most correct way. """
    for _ in LOOPS:
        i = int(X) # -100
        f = (X*1e17-i*1e17)/1e17 # -0.1323

def fun_b():
    """ The integer (i) and fraction (f) part will
        come out as float.
        NOTE: The only difference between this
              and math.modf is the accuracy. """
    for _ in LOOPS:
        i = int(X) # -100
        i, f = float(i), (X*1e17-i*1e17)/1e17 # (-100.0, -0.1323)

def fun_c():
    """ Performance test of the statements in a function.
        The integer part (i) is an integer, and
        the fraction part (f) is a float. """
    def modf(x):
        i = int(x)
        return i, (x*1e17-i*1e17)/1e17

    for _ in LOOPS:
        i, f = modf(X) # (-100, -0.1323)

def fun_d():
    for _ in LOOPS:
        f, i = math.modf(X) # (-100.0, -0.13230000000000075)

def fun_e():
    """ Convert the integer part to integer. """
    for _ in LOOPS:
        f, i = math.modf(X) # (-100.0, -0.13230000000000075)
        i = int(i) # -100

if __name__ == '__main__':
    cProfile.run('fun_a()')
    cProfile.run('fun_b()')
    cProfile.run('fun_c()')
    cProfile.run('fun_d()')
    cProfile.run('fun_e()')

산출:

         4 function calls in 1.312 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    1.312    1.312 <string>:1(<module>)
        1    1.312    1.312    1.312    1.312 new1.py:10(fun_a)
        1    0.000    0.000    1.312    1.312 {built-in method builtins.exec}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}


         4 function calls in 1.887 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    1.887    1.887 <string>:1(<module>)
        1    1.887    1.887    1.887    1.887 new1.py:17(fun_b)
        1    0.000    0.000    1.887    1.887 {built-in method builtins.exec}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}


         5000004 function calls in 2.797 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    2.797    2.797 <string>:1(<module>)
        1    1.261    1.261    2.797    2.797 new1.py:23(fun_c)
  5000000    1.536    0.000    1.536    0.000 new1.py:27(modf)
        1    0.000    0.000    2.797    2.797 {built-in method builtins.exec}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}


         5000004 function calls in 1.852 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    1.852    1.852 <string>:1(<module>)
        1    1.050    1.050    1.852    1.852 new1.py:34(fun_d)
        1    0.000    0.000    1.852    1.852 {built-in method builtins.exec}
  5000000    0.802    0.000    0.802    0.000 {built-in method math.modf}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}


         5000004 function calls in 2.467 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    2.467    2.467 <string>:1(<module>)
        1    1.652    1.652    2.467    2.467 new1.py:38(fun_e)
        1    0.000    0.000    2.467    2.467 {built-in method builtins.exec}
  5000000    0.815    0.000    0.815    0.000 {built-in method math.modf}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

노트:

명령문은 모듈로를 사용하면 더 빠를 수 있지만 모듈로는 음수를 정수 및 분수 부분으로 분할하는 데 사용할 수 없습니다.

i, f = int(x), x*1e17%1e17/1e17 # x can not be negative
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.