2014-04-30 4 views
0

ceil() 함수를 사용하여 부동 소수점 계산 결과를 가장 가까운 정수로 반올림합니다. 나는이 ...ceil() 함수가 예상 값을 반환하지 않음

수행되는 부동 소수점 계산을하는 것입니다 실현

int(ceil(1.01*100)) = 101 
int(ceil(1.02*100)) = 102 
int(ceil(1.03*100)) = 103 
int(ceil(1.04*100)) = 104 
int(ceil(1.05*100)) = 105 
int(ceil(1.06*100)) = 106 
int(ceil(1.07*100)) = 107 
int(ceil(1.08*100)) = 108 
int(ceil(1.09*100)) = 110 *** 
int(ceil(1.10*100)) = 111 *** 
int(ceil(1.11*100)) = 112 *** 
int(ceil(1.12*100)) = 113 *** 
int(ceil(1.13*100)) = 113 

: 다른 입력의 모든 종류는 여기에

int(ceil(A*B)) 

이 문제를 설명하기 위해 몇 가지 예입니다 ... 경험
1.09*100 = 109.000000.... > 109 

나는 방법 트랩 신뢰성이 버그

아무 생각이 없다

나는 그런 것과 같은 '원유'방법 중 몇 가지가 아래에 설명이 있지만, 나는 강력한 충분히 솔루션을 수 있도록이 생각하지 않는다

int(ceil((1.09*100)-0.00000001)) = 109 
+5

숫자가 어디서 오는가에 따라 ['Decimal'] (https://docs.python.org/2/library/decimal.html) 모듈을 살펴볼 수 있습니다. 단지'1.09'를 타이프하는 것은 이미'1.0900000000000001'입니다. – mhlester

답변

3

문제는 새롭지도 파이썬 고유도 아니지만 부동 소수점 계산에 내재되어 있습니다. 한때 Fortran 4를 사용했던 모든 다이노 사우루스는 그것을 알고 있습니다 : 프로그래머는 예상 정밀도 & ε를 알고 있어야합니다; 귀하의 계산. 그래서 : 동등 X 열등 | x - y | < ε

  • 가장 큰 정수 floor(x + ε)
  • 최소의 정수 X보다 큰 경우

    • 두 숫자의 x와 y는 고려되어야 그래서 ceil(x - ε)

    되어 있습니다 ε에 대한 좋은 가치가 무엇인지 알 수있는 방법이 있다면, 제안 된 솔루션이 좋습니다. 모듈을 작성하는 경우 사용자가 모듈을 지정할 수있게해야합니다.

  • +0

    멋진 트릭. 현재로서는 유용 할 것이고 숫자의 부동 표현 만 가능합니다. 이것은 두 점의 일치가 항상 정밀함을 염두에두고 테스트되어야하는 CAD 응용 프로그램 프로그래밍을 생각 나게합니다. –

    +0

    좋은, 간결한 설명을 위해 건배. (우연히 CAD 응용 프로그램의 일부 오래된 포트란을 변환 중입니다) –

    2

    당신은 문제가 부동의 제한된 정밀도에 기인하는 것이 옳다 번호.

    decimal 모듈은 당신의 친구입니다 : 그렇지 않으면 첫번째 부동 소수점 숫자로 파이썬 구문 분석, 당신이 정말로 문자열로 번호를 제공해야한다는,

    from decimal import Decimal 
    from math import ceil 
    
    print int(ceil(Decimal("1.10") * 100)) 
    

    주 (그리고 여기에 우리가 정확하게 문제를 얻을 우리 피하고 싶다).

    +0

    십진수 모듈을 읽기 시작했습니다. 포인터를 건배합니다 –