십진법 전후에 매우 큰 숫자가 있습니다. 그러나 이것을 4.58이라고 부릅니다.파이썬 3 - float (X) * i = int (Z)
X가 곱 해져서 float 번호가 아닌 정수가되는 숫자 Y를 알고 싶습니다.
from decimal import *
setcontext(ExtendedContext)
getcontext().prec = 300
x=Decimal('4.58')
while True:
i=1
a=Decimal(i*x)
if float(a).is_integer():
print(i*x)
break
else:
i=+1
그러나,이 방법은 매우 느리고 비효율적이다 :
여기 내 코드입니다. 나는 Y의 가치를 예측할 수 있도록 어떻게 계속 분수 나 다른 방법을 구현할 수 있을까?
편집
소수점 저장 모듈이 문자열로 더 정확하게 번호 떠 있으므로 0.5 0.499999999가되지 것이다.
편집 2
나는 X (4.58)를 가지고있다.
정수를 만들기 위해 X가 어떤 숫자를 늘릴 것인지 알고 싶습니다. 가능한 한 효율적으로
편집 3
좋아, 아직 아마 내 가장 좋은 질문입니다.
여기 내 딜레마가 있습니다.
내가 만든 사소한 프로그램에서 스팟이 나왔습니다. 이 숫자는 십진수 1.5입니다.
내가 원했던 것은 다른 정수를 산출하기 위해 정수에 소수점을 곱하는 것입니다.
1.5의 경우, 가장 좋은 대답이 될 것입니다 (2) (1.5 * 2 = 3) (플로트 *의 INT = INT)
내 위의 루프는 동안 결국,하지만 난 그냥 여부를 알고 싶어, 그렇게 할 것 지속적인 분수와 같은 더 좋은 방법이있었습니다. 있을 경우 어떻게 구현할 수 있습니까?
편집 4
여기 user6794072 내 코드 감사합니다. 길지만 기능적입니다.
from gmpy2 import mpz, isqrt
from fractions import Fraction
import operator
import functools
from decimal import *
setcontext(ExtendedContext)
getcontext().prec = 300
def factors(n):
n = mpz(n)
result = set()
result |= {mpz(1), n}
def all_multiples(result, n, factor):
z = n
f = mpz(factor)
while z % f == 0:
result |= {f, z // f}
f += factor
return result
result = all_multiples(result, n, 2)
result = all_multiples(result, n, 3)
for i in range(1, isqrt(n) + 1, 6):
i1 = i + 1
i2 = i + 5
if not n % i1:
result |= {mpz(i1), n // i1}
if not n % i2:
result |= {mpz(i2), n // i2}
return result
j=Decimal('4.58')
a=(Fraction(j).numerator)
b=(Fraction(j).denominator)
y=(factors(a))
x=(factors(b))
q=([item for item in x if item not in y])
w=([item for item in y if item not in x]) q.extend(w)
p=(functools.reduce(operator.mul, q, 1)) ans=(p*j)
print(ans)
대부분의 숫자에는 정확한 'float'표현이 없으므로 웜이됩니다 (예 : '0.3'은 '0.299999999999999988897769753748434595763683319091796875'가됩니다). – NPE
'range'는'float' 값을 허용하지 않습니다. 유효한 예를 제공해주십시오. –
"다른 부동 소수점 숫자, Y를 알고 싶습니다. X가 곱 해져서 부동 소수점 숫자가 아닌 정수가됩니다." * * 다른 부유물? 왜 그런 플로트가 존재한다고 생각합니까, 아니면 독특한 것입니까? – user2357112