2016-11-09 1 views
0

필자는 사람이 디스플레이 할 수 있도록 부동 소수점 숫자를 사용자가 포맷하는 것을 다루는 일부 인 코드를 다루고 있습니다.파이썬 포맷 스트링과 부동 소수점 표현

현재 구현에서이 작업을 수행합니다 :

의미가 및 대부분의 경우 잘 작동
"{0:.24f}".format(some_floating_point).rstrip('0') 

. 그러나 0.0003과 같은 값에 직면했을 때 상황이 나아지지 않습니다.

>>> "{0:.24f}".format(0.0003).rstrip('0') 
'0.000299999999999999973719' 

추가 조사 결과에 따르면 파이썬은 요청한 자릿수에 따라 기본 표현을 변경하는 것으로 보입니까?

>>> "{0:.15f}".format(0.0003) 
'0.000300000000000' 
>>> "{0:.20f}".format(0.0003) 
'0.00029999999999999997' 

내 가정은 단 정밀도 대 double입니다.

사용자는 데이터베이스에 저장된 값을 double로 입력하고 양식이 나중에 다시 렌더링 될 때 같은 값이 필드에 미리 채워집니다. 따라서 이러한 표현의 1 : 1 매핑이 필요합니다.

내 질문에 대한 대답은 다음과 같습니다.이 문제를 해결하기 위해 우아하고 더 중요한 것은 무엇입니까? 지금까지의 최선의 노력은 log10과 관련되어 있으며 멋지게 배치하는 데 이상적이지 않습니다.

편집 : Prune은 값이 실제로 변경되지는 않지만 형식에 의한 반올림은 9s가 0이되도록 수행합니다 (오). 그 행동은 의미가 있지만 솔루션은 여전히 ​​나를 벗어나고 있습니다.

+0

이에 대한 우아한 해결책이 없다, 그것은 기본이 내가 대답을 제공 할 수있는베이스 (10)의 차이에 내재하지만 너무 LOG10을 필요로 - 당신이 자리의 수를 제한 할 필요가 double 형에 격납 된 유효 자리수의 1보다 작은 형식 –

답변

1

저장 한 번호를 수신하고 있습니다. 0.0003은 이진 소수로 정확하게 저장할 수 없습니다. 설명하려면 :

>>> 0.00029999999999999997 == 0.0003 
True 

인쇄 형식은 숫자의 최하위 자리를 반올림합니다. 이중 정밀도는 문제를 오른쪽으로 밀어 넣기 만합니다. 문제를 기본 눈 10 개로 완전히 "해결"하려면 10 진수 산술로 전환하거나 간단한 값에 충분히 근접한 숫자에 대해 자체 문자열 처리기를 구축해야합니다 (소수 부분의 9 또는 0의 수상한 문자열).).


다음은 당신을위한 기능의 시작입니다. 0.0004 이상으로 머리카락을 저장합니다. 9의 경우는 연습으로 남아 있습니다 :-).

def str_round(x): 
    size = 6 
    nines = '9'*size 
    zeros = '0'*size 

    str = "{0:.24f}".format(x).rstrip('0') 
    str_len = len(str) 
    print str, str_len 

    if nines in str: 
     # replace leading digit with one more 
     pos = str.index(nines) 
     # ADD CODE HERE 
     # Turn the leading portion into an integer; 
     # increment and convert back to zero-leading string. 
     # Fill out the rest with zeros. 

    elif zeros in str: 
     # Change all trailing digits to 0 
     pos = str.index(zeros) 
     str = str[:pos] + '0'*(str_len - pos) 

    return str 

print str_round(0.0004) 
+0

아하, 어떻게 든 실현하지 못했습니다. 29999는 최대 30000까지 반올림합니다. 따라서이 경우 9가 아닌 숫자로 서식을 지정하라는 요청을받을 때 "중단됩니다". 웬일인지 나는 더 복잡한 무엇인가하고있다라고 생각했다. 그러나 여전히 많은 해결책을 제공하지는 못합니다. – Zigsaz

관련 문제