십진수를 분수로 변환하는 방법은 무엇입니까?
파이썬에서 소수점을 가장 낮은 형태의 분수로 변환하는 방법이 궁금합니다.
예:
0.25 -> 1/4
0.5 -> 1/2
1.25 -> 5/4
3 -> 3/1
두 가지 옵션이 있습니다.
사용:
>>> (0.25).as_integer_ratio() (1, 4)
(Python 3.6부터는 객체에서도 동일한 작업을 수행할 수 있습니다.)
다음 유형을 사용합니다.
>>> from fractions import Fraction >>> Fraction(0.25) Fraction(1, 4)
후자는 매우 도움이 됩니다.str()
변환:
>>> str(Fraction(0.25))
'1/4'
>>> print Fraction(0.25)
1/4
부동 소수점 값은 부정확할 수 있으므로 '이상한' 분수로 끝날 수 있습니다. 분모를 제한하여 다음과 같이 분수를 다소 '간소화'할 수 있습니다.
>>> Fraction(0.185)
Fraction(3332663724254167, 18014398509481984)
>>> Fraction(0.185).limit_denominator()
Fraction(37, 200)
만약 당신이 여전히 파이썬 2.6을 사용하고 있다면,Fraction()
아직 통과를 지원하지 않습니다.float
직접적이지만 위의 두 가지 기술을 결합하여 다음과 같은 작업을 수행할 수 있습니다.
Fraction(*0.25.as_integer_ratio())
또는 클래스 방법을 사용할 수 있습니다.
Fraction.from_float(0.25)
이는 본질적으로 동일한 작업을 수행합니다. 예를 들어 정수 비율 튜플을 가져와서 두 개의 개별 인수로 전달합니다.
샘플 값을 포함한 소규모 데모:
>>> for f in (0.25, 0.5, 1.25, 3.0):
... print f.as_integer_ratio()
... print repr(Fraction(f)), Fraction(f)
...
(1, 4)
Fraction(1, 4) 1/4
(1, 2)
Fraction(1, 2) 1/2
(5, 4)
Fraction(5, 4) 5/4
(3, 1)
Fraction(3, 1) 3
둘 다fractions
모듈 및float.as_integer_ratio()
메서드는 Python 2.6의 새로운 기능입니다.
from fractions import Fraction
print(Fraction(0.25))
print(Fraction(0.5))
print(Fraction(1.25))
print(Fraction(3))
#1/4
#1/2
#5/4
#3
Martjn Pieters를 확장하기 위해 더 복잡한 플로트에 내재된 부정확함으로 인해 추가 옵션이 있는 훌륭한 답변을 제공합니다.예:
>>> f = 0.8857097
>>> f.as_integer_ratio()
(1994440937439217, 2251799813685248) # mathematically wrong
>>> Fraction(f)
Fraction(1994440937439217, 2251799813685248) # same result but in a class
>>> Fraction(f).limit_denominator()
Fraction(871913, 984423) # still imprecise
원하는 수학적 결과는 다음과 같습니다.8857097/10000000
현에 캐스팅한 다음 조작하면 얻을 수 있는 것입니다.
편집된 응답
저는 정확도 문제를 해결하기 위한 훨씬 더 간단한 방법을 찾았습니다.
>>> Fraction(str(f))
Fraction(8857097, 10000000)
문자열에 대한 캐스팅은 정확한 소수점 인스턴스도 허용합니다.
>>> Decimal(f).as_integer_ratio()
(1994440937439217, 2251799813685248)
>>> Decimal(str(f)).as_integer_ratio()
(8857097, 10000000)
원래 응답
def float_to_ratio(flt):
if int(flt) == flt: # to prevent 3.0 -> 30/10
return int(flt), 1
flt_str = str(flt)
flt_split = flt_str.split('.')
numerator = int(''.join(flt_split))
denominator = 10 ** len(flt_split[1])
return numerator, denominator
이제 테스트해 보겠습니다.
>>> float_to_ratio(f)
(8857097, 10000000) # mathematically correct
이러한 종류의 분수 정밀도는 최적화되지 않으며 일반적으로 필요하지 않지만 완전성을 위해 여기에 있습니다.이 함수는 분수를 단순화하지는 않지만, 분수를 줄이기 위해 추가 처리를 수행할 수 있습니다.
>>> n = 0.5
>>> float_to_ratio(n)
(5, 10)
>>> Fraction(*float_to_ratio(n))
Fraction(1, 2)
적절한 부분을 인쇄하려면 다음과 같은 작은 레시피가 필요합니다.
from fractions import Fraction
def dec_to_proper_frac(dec):
sign = "-" if dec < 0 else ""
frac = Fraction(abs(dec))
return (f"{sign}{frac.numerator // frac.denominator} "
f"{frac.numerator % frac.denominator}/{frac.denominator}")
다음과 같이 인쇄됩니다.
>>> dec_to_proper_frac(3.75)
>>> "3 3/4"
이것이 간단하고 적절하게 하는 방법입니다.
분수 사용:
from fractions import Fraction
decimals = [0.25, 0.5, 1.25, 3, 0.6, 0.84]
for d in decimals:
print(Fraction(str(d))) #Cast as string for proper fraction
십진수 사용:
from decimal import Decimal
decimals = [0.25, 0.5, 1.25, 3, 0.6, 0.84]
for d in decimals:
d = Decimal(str(d)) #Cast as string for proper fraction
nominator,denominator = d.as_integer_ratio()
if denominator==1:
print(a)
else:
print(nominator,denominator, sep="/")
출력:
1/4
1/2
5/4
3
3/5
21/25
가장 쉬운 방법 중 하나는as_integer_ratio()
이것처럼.
b = 0.125
b.as_integer_ratio()
# Output as Tuple(1, 8).Numerator as 1 & Denominator as 8
언급URL : https://stackoverflow.com/questions/23344185/how-to-convert-a-decimal-number-into-fraction
'programing' 카테고리의 다른 글
NodeJS를 통해 엔드포인트로 Ajax 요청을 작성하는 방법 (0) | 2023.08.09 |
---|---|
scanf() 형식 문자열에서 후행 공백의 영향은 무엇입니까? (0) | 2023.08.09 |
구글은 폴리곤으로 v3 API 마우스를 매핑합니까? (0) | 2023.08.09 |
이메일 주소의 유효성을 확인하려면 어떻게 해야 합니까? (0) | 2023.08.04 |
Javascript를 사용한 함수 호출로 포스트 폼 제출 시뮬레이션 (0) | 2023.08.04 |