2017-01-11 2 views
3

안녕하세요 큰 float 숫자로 모듈로를 사용하려하지만 파이썬은 큰 숫자를 좋아하지 않는 것 같습니다. 이 개 정수의 부서 나에게 정수 여부 (그렇다면 division_result%1 == 0 여부를) 주면 내 목표는 확인하는 것입니다큰 float 숫자를 모듈로 처리하는 방법

예 :

x = 3**2 
x = x+0.3 
x%1 
result = 0.3000000000000007 | expected = 0.3 
x = 3**199 
x = x+0.3 
x%1 
result = 0.0 |expected = 0.3 

어떻게 결과의 정밀도를 향상시킬 수 있습니까? 아니면 부서가 정수를 제공하는지 확인하는 영리한 방법을 찾으십니까?

+2

읽기 [부동 소수점 표현 (https://en.wikipedia.org/wiki/Floating_point) : 파이썬 큰 정수를 처리 할 수 ​​있기 때문에 그리고, 이것은 64 비트보다 긴 정수, 예컨대 작동합니다. 충분히 큰 부동 소수점 숫자로 인해 모든 숫자를 추적 할만큼 정밀도가 충분하지 않으므로 잘못된 결과가 발생합니다. – Leon

답변

2
이됩니다.

정수의 경우 xy의 경우 y/xy % x == 0 인 경우에만 정수입니다. xy이 정수인 경우 부동 소수점 오류 또는 특수 수치 클래스 또는 기타 항목에 대해 걱정할 필요가 없습니다. xy이 실제로는 정수로 표시되고 수레로 표시되지 않도록하십시오. 대한

> x = 17**100 
> y = 17**200  
> y % x 
0 
> (y + 1) % x 
1 
0

당신은 실제 또는 자연수의 값을 테스트하는 float.is_integer()를 사용할 수 있습니다

>>> x=3**23 
>>> y=3**299 
>>> res=x/y 
>>> res 
2.0631637441810574e-132 
>>> res.is_integer() 
False 
>>> res=4.0000000000004 
>>> res.is_integer() 
False 
>>> res=4.000 
>>> res.is_integer() 
True 
4

모든 분수 represented exactly as floats 될 수 있습니다. 따라서 귀하의 접근 방식은 예상대로 작동하지 않습니다. 당신이 Fraction을 사용할 수

from fractions import Fraction 

print(repr(Fraction(25, 5))) # Fraction(5, 1) 

이 방법 :

def div_result_int(a, b): 

    f = Fraction(a, b) 
    return f.denominator == 1 

print(div_result_int(a=25, b=5)) # True 
print(div_result_int(a=25, b=3)) # False 
0

또 다른 옵션은 decimal 모듈은 당신이 시도 할 수 무엇

fractions 모듈입니다. 첫 번째 예와

:

import decimal 
x = decimal.Decimal('9.3') 
x % 1 

그 결과 두 번째 예와 Decimal('0.3')

될 것입니다, 당신은 50 정밀도 설정해야 : 다시

decimal.getcontext().prec = 50 
x = decimal.Decimal('171792506910670443678820376588540424234035840667.3') 

을, x % 1의 결과는 Decimal('0.3')

관련 문제