정수 부분과 소수 부분 과 같이 숫자 1234.5678
를 두 부분 으로 나누는 비단뱀적인 방법이 (1234, 0.5678)
있습니까?
답변:
사용 math.modf
:
import math
x = 1234.5678
math.modf(x) # (0.5678000000000338, 1234.0)
int
변수 이름으로 사용하지 마십시오 int
. 함수 를 재정의합니다 .
int_
소리내어 읽을 때 "int"라고하는 변수가 있어야하는 경우 사용 합니다.
유명하지 않은 내장 함수를 사용할 수 있습니다. divmod :
>>> s = 1234.5678
>>> i, d = divmod(s, 1)
>>> i
1234.0
>>> d
0.5678000000000338
divmod(-4.5,1)
제공합니다. -5.0 및 0.5를 제공합니다. 사용 divmod(-4.5, -1)
하면 4.0과 -0.5가됩니다.
>>> a = 147.234
>>> a % 1
0.23400000000000887
>>> a // 1
147.0
>>>
정수 부분을 실수가 아닌 정수로 사용하려면 int(a//1)
대신 사용하십시오. 단일 구절에서 튜플을 얻으려면 :(int(a//1), a%1)
편집 : float 숫자의 소수 부분은 근사치 이므로 사람처럼 표현하려면 소수 라이브러리 를 사용해야합니다.
-2.25 // 1 == -3.0
및 -2.25 % 1 == 0.75
. 정수 부분 + 소수 부분이 여전히 원래 값과 같기 때문에 이것은 OP가 원하는 것일 수 있습니다. 대조적으로 math.modf(-2.25) == (-0.25, -2.0)
.
intpart,decimalpart = int(value),value-int(value)
양수에 대해 작동합니다.
In [1]: value = 1.89
In [2]: intpart,decimalpart = int(value),value-int(value)
In [3]: intpart
Out [3]: 1
In [4]: decimalpart
Out [4]: 0.8899999999999999
이것이 내가하는 방법입니다.
num = 123.456
split_num = str(num).split('.')
int_part = int(split_num[0])
decimal_part = int(split_num[1])
몇 가지 답변을 살펴본 후. 정확성을 손상시키지 않고 양수와 음수를 정수와 분수로 나눌 수있는이 두 가지 진술을 생각해 냈습니다. 성능 테스트는 두 개의 새로운 명령문이 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