소수점 뒤의 숫자는 어떻게 구합니까?
예를 들어, 내가있는 5.55
경우 어떻게 얻을 수 .55
있습니까?
소수점 뒤의 숫자는 어떻게 구합니까?
예를 들어, 내가있는 5.55
경우 어떻게 얻을 수 .55
있습니까?
답변:
당신을위한 쉬운 접근 :
number_dec = str(number-int(number))[1:]
number_dec = str(number-int(number)).split('.')[1]
5.55 % 1
이것은 또한 더 일반적으로 유용한 대답입니다. 위의 대답은 Python에만 해당되는 반면 모듈로 나누기 접근 방식을 여러 언어로 사용할 수 있습니다.
.55
은 질문 제목 때문에 예상하지 못한 점 ( )을 포함하는 문자열을 반환합니다 !
str(5.55 - int(5.55))[1:]
질문에 언급 된 .5499999999999998
대신 반환 됩니다 .55
.
5.55 % 1
이것은 부동 소수점 반올림 문제에 도움이되지 않습니다. 즉, 다음을 얻을 수 있습니다.
0.550000000001
아니면 당신이 기대하는 0.55에서 약간 떨어져 있습니다.
modf
경우 정밀도도 조일 수 있습니다. math.modf(5.55)
(0.5499999999999998, 5.0)을 반환합니다.
x%1
은 x-int(x)
및 modf(x)[0]
방법 보다 거의 두 배 빠릅니다 (타이밍은 980ns, 1.39us 및 1.47us로 평균 1000000 회 실행). 에 대한 내 가치 x
는 항상 긍정적이어서 걱정할 필요가 없었습니다.
modf 사용 :
>>> import math
>>> frac, whole = math.modf(2.5)
>>> frac
0.5
>>> whole
2.0
math.modf(2.53) = (0.5299999999999998, 2.0)
예상 답은 0.53
decimal
표준 라이브러리 의 모듈을 사용하면 원래 정밀도를 유지하고 부동 소수점 반올림 문제를 방지 할 수 있습니다.
>>> from decimal import Decimal
>>> Decimal('4.20') % 1
Decimal('0.20')
n = 5.55
, n은 float이고 Decimal(str(n)) % 1
, 분수 부분을 얻기 위해 해야합니다 . (정수가있는 경우에는 필요하지 않지만
10.0/3 % 1
적어도 내 시스템에
Decimal.from_float(1.2)
(지금은로 쓸 수 있음 Decimal(1.2)
) 사용하면 반올림 문제가 발생 하며이 답변은 피하려고했습니다.
받아 들여지는 대답과 비슷하게 문자열을 사용하는 더 쉬운 접근 방식은
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
하시겠습니까?
float
; 파이썬은 그것이 원래 표현 된 형식에 대한 지식을 유지하지 않습니다. 제 number = 1e-5
예는 똑같이 잘 적용됩니다 number = 0.00001
: str
숫자 의 표현은 과학적 표기법입니다. 그건 그렇고, e+
뿐만 아니라 처리하고 싶을 e-
것입니다.
import math
orig = 5.55
whole = math.floor(orig) # whole = 5.0
frac = orig - whole # frac = 0.55
>>> n=5.55
>>> if "." in str(n):
... print "."+str(n).split(".")[-1]
...
.55
때때로 후행 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)
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
import math
, 왜 그냥 사용하지 math.modf()
않습니까?
math.floor(-1.1) == -2
하지만 int(-1.1) == -1
. 이 질문에 대해서는 사용 int
이 더 정확합니다.
부동 숫자는 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
import math
x = 1245342664.6
print( (math.floor(x*1000)%1000) //100 )
확실히 효과가 있었다
이건 어떤가요:
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를 계산할 때 반올림 오류가 반올림의 두 번째 매개 변수를 방해하지 않는 한 대부분의 경우 작동합니다.
이것을 시도해 볼 수 있습니다.
your_num = 5.55
n = len(str(int(your_num)))
float('0' + str(your_num)[n:])
반환 0.55
됩니다.
number=5.55
decimal=(number-int(number))
decimal_1=round(decimal,2)
print(decimal)
print(decimal_1)
출력 : 0.55
또 다른 옵션은 또는 다음 re
과 함께 모듈 을 사용하는 것입니다 .re.findall
re.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의 오른쪽 상단 패널에 설명되어 있습니다. 원하는 경우이 링크 에서 일부 샘플 입력과 어떻게 일치하는지 볼 수도 있습니다.
정말 큰 분수 부분을 가진 정말 큰 숫자는 분수를 얻기 위해 모듈로 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')