소수점 이하 숫자를 얻는 방법?


답변:


29

당신을위한 쉬운 접근 :

number_dec = str(number-int(number))[1:]

30
독자를위한 연습 문제 : 10보다 크거나 같은 숫자에 대해 작동하도록 만들기
intuited

11
number_dec = str(number-int(number)).split('.')[1]
Ryan Allen

28
이것은 불필요하게 복잡한 접근 방식이기 때문에 반대표를 던집니다. 내가 찾던 대답은 다음 대답이었습니다. 5.55 % 1이것은 또한 더 일반적으로 유용한 대답입니다. 위의 대답은 Python에만 해당되는 반면 모듈로 나누기 접근 방식을 여러 언어로 사용할 수 있습니다.
Stew

3
참고 : 이 솔루션 .55은 질문 제목 때문에 예상하지 못한 점 ( )을 포함하는 문자열을 반환합니다 !
T. 크리스티안

8
str(5.55 - int(5.55))[1:]질문에 언급 된 .5499999999999998대신 반환 됩니다 .55.
크리스티안 Ciupitu

198
5.55 % 1

이것은 부동 소수점 반올림 문제에 도움이되지 않습니다. 즉, 다음을 얻을 수 있습니다.

0.550000000001

아니면 당신이 기대하는 0.55에서 약간 떨어져 있습니다.


7
modf경우 정밀도도 조일 수 있습니다. math.modf(5.55)(0.5499999999999998, 5.0)을 반환합니다.
bereal

1
누구든지 더 빠른 작업, 위에서 설명한이 방법 또는 float b = a-int (a)를 알고 있습니까? 나는 나중에 의심하지만 확인이 있는지보고 싶었습니다
hokkuk

4
Raspberry Pi에서이 방법 x%1x-int(x)modf(x)[0]방법 보다 거의 두 배 빠릅니다 (타이밍은 980ns, 1.39us 및 1.47us로 평균 1000000 회 실행). 에 대한 내 가치 x는 항상 긍정적이어서 걱정할 필요가 없었습니다.
coderforlife

확실히 모듈 작동이 더 빠릅니다. 이름 조회를 할 필요가 없습니다. int 함수를 호출하면 전역 변수를 조회합니다.
엔리코 BORBA

frac () 만있는 것이 아닙니다
mckenzm

155

modf 사용 :

>>> import math
>>> frac, whole = math.modf(2.5)
>>> frac
0.5
>>> whole
2.0

2
좋은 해결책이지만 math.modf(2.53) = (0.5299999999999998, 2.0)예상 답은 0.53
Lord Loh입니다.

4
@LordLoh. 이는 부동 소수점 반올림 때문이며 모든 방법에서 발생합니다.
Rena

@LordLoh. round (0.5299999999999998, 2)를 사용하여 0.53을 얻으십시오. 또 다른 방법은 decimal 패키지에서 Decimal을 사용하는 것입니다. docs.python.org/2/library/decimal.html
SirJ

57

이건 어떤가요:

a = 1.3927278749291
b = a - int(a)

b
>> 0.39272787492910011

또는 numpy를 사용하여 :

import numpy
a = 1.3927278749291
b = a - numpy.fix(a)

33

decimal표준 라이브러리 의 모듈을 사용하면 원래 정밀도를 유지하고 부동 소수점 반올림 문제를 방지 할 수 있습니다.

>>> from decimal import Decimal
>>> Decimal('4.20') % 1
Decimal('0.20')

주석의 모든 메모 처럼 먼저 native float를 문자열 로 변환해야합니다 .


원래 질문자에게 도움이되도록 : 부동 소수점을 십진수로 변환하려면 먼저 문자열로 변환해야합니다. 그래서 만약 당신이를 가지고 있다면 n = 5.55, n은 float이고 Decimal(str(n)) % 1, 분수 부분을 얻기 위해 해야합니다 . (정수가있는 경우에는 필요하지 않지만
아프지는

2
@intuited : 그것은 소수 할 필요는 없습니다, 그것은 플로트도 작동합니다 10.0/3 % 1적어도 내 시스템에
aherok

2
문자열을 사용하는 대신 from_float를 사용할 수 있습니다. d = Decimal.from_float (1.2)
Matthew Purdon 2014-08-15

@intuited 소수 부분을 정수로 얻는 방법은 무엇입니까? to_integer () 메서드를 시도했지만 유형은 여전히 ​​Decimal입니다.
D1X

1
@MatthewPurdon- Decimal.from_float(1.2)(지금은로 쓸 수 있음 Decimal(1.2)) 사용하면 반올림 문제가 발생 하며이 답변은 피하려고했습니다.
John Y


5

받아 들여지는 대답과 비슷하게 문자열을 사용하는 더 쉬운 접근 방식은

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 Dickinson

@mark 질문은 소수점 뒤의 숫자를 어떻게 얻습니까? 사용자가 십진수 표기법 (과학하지 표기)에 플로트를 기대하고, 그래서 나도 과학적 표기법에 대한 블록을 추가 한
yosemite_k

숫자는 숫자입니다. 과학적 표기법에있을 수있는 숫자의 표현 일뿐 입니다. 따라서 "10 진수 표기법의 부동"은 여기서별로 의미가 없습니다. 파이썬이 그것을 볼 때, 그것은 단지 float; 파이썬은 그것이 원래 표현 된 형식에 대한 지식을 유지하지 않습니다. 제 number = 1e-5예는 똑같이 잘 적용됩니다 number = 0.00001: str숫자 의 표현은 과학적 표기법입니다. 그건 그렇고, e+뿐만 아니라 처리하고 싶을 e-것입니다.
Mark Dickinson

4
import math
orig = 5.55
whole = math.floor(orig)    # whole = 5.0
frac = orig - whole         # frac = 0.55

>>> frac 0.5499999999999998
macm

4
>>> n=5.55
>>> if "." in str(n):
...     print "."+str(n).split(".")[-1]
...
.55

2
다양한 종류의 숫자에는 괜찮지 만 과학적 표기법이 필요할만큼 크거나 작은 숫자에는 잘 작동하지 않습니다.
kindall 2010 년

2

이것은 내가 시도한 해결책입니다.

num = 45.7234
(whole, frac) = (int(num), int(str(num)[(len(str(int(num)))+1):]))

2

때때로 후행 0이 중요합니다.

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에 대해 무엇을합니까?
Aditya Patnaik

1

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

5
당신이하려는 경우 import math, 왜 그냥 사용하지 math.modf()않습니까?
ire_and_curses

@ire_and_curses : 문제에 대한 대체 솔루션을 제공하고 있습니다.

1
floor는 int로 캐스팅하는 것과 동일하므로 math.floor (t)를 int (t)로 대체 할 수 있습니다.
QuantumKarl

@QuantumKarl 아니요, 그들은 다릅니다. math.floor(-1.1) == -2하지만 int(-1.1) == -1. 이 질문에 대해서는 사용 int이 더 정확합니다.
Lambda Fairy

1

부동 숫자는 10 진수 (base10) 형식으로 저장되지 않습니다. 파이썬 문서를 읽으십시오그 이유를 충족시키기 위해 이것에 를 보십시오. 따라서 float에서 base10 표현을 얻는 것은 바람직하지 않습니다.

이제 10 진수 형식으로 숫자 데이터를 저장할 수있는 도구가 있습니다. 아래는 Decimal라이브러리 를 사용한 예 입니다.

from decimal import *

x = Decimal('0.341343214124443151466')
str(x)[-2:] == '66'  # True

y = 0.341343214124443151466
str(y)[-2:] == '66'  # False

1

예:

import math
x = 5.55
print((math.floor(x*100)%100))

이것은 소수점 뒤에 두 개의 숫자를 제공합니다. 하나의 숫자가 필요한 경우 위의 계산을 10으로 줄이거 나 소수점 뒤에 원하는 숫자의 수에 따라 늘립니다.


이것은 분수 값이 아닌 값을 반환하기 때문에 좋지만 음수에서는 중단됩니다
Meow

불행히도 대부분의 경우 작동하지 않습니다. @Meow
론의 후작


1

간단한 연산자 구분 '/'바닥 구분 '//'을 사용 하면 주어진 float의 분수 부분을 쉽게 얻을 수 있습니다.

number = 5.55

result = (number/1) - (number//1)

print(result)

0

이건 어떤가요:

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를 계산할 때 반올림 오류가 반올림의 두 번째 매개 변수를 방해하지 않는 한 대부분의 경우 작동합니다.


설명이 있습니까?

0

이것을 시도해 볼 수 있습니다.

your_num = 5.55
n = len(str(int(your_num)))
float('0' + str(your_num)[n:])

반환 0.55됩니다.


0
number=5.55
decimal=(number-int(number))
decimal_1=round(decimal,2)
print(decimal)
print(decimal_1)

출력 : 0.55


0

파이썬 3에서 소수점 뒤의 숫자를 얻기 위해 자주하는 일을보십시오 :

a=1.22
dec=str(a).split('.')
dec= int(dec[1])

0

pandas를 사용하는 경우 :

df['decimals'] = df['original_number'].mod(1)

0

또 다른 옵션은 또는 다음 re과 함께 모듈 을 사용하는 것입니다 .re.findallre.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의 오른쪽 상단 패널에 설명되어 있습니다. 원하는 경우이 링크 에서 일부 샘플 입력과 어떻게 일치하는지 볼 수도 있습니다.


출처

파이썬 빼기에서 추가 부동 숫자를 제거하는 방법은 무엇입니까?


0

정말 큰 분수 부분을 가진 정말 큰 숫자는 분수를 얻기 위해 모듈로 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')

0

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

0

솔루션은 모듈로 및 반올림을 사용합니다.

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입니다.



-2

또 다른 미친 해결책은 (문자열로 변환하지 않고) 다음과 같습니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.