몇 가지 유사한 질문에 대한 답변을 살펴본 후에 이것은 가장 좋은 해결책 인 것 같습니다.
def floatToString(inputValue):
return ('%.15f' % inputValue).rstrip('0').rstrip('.')
내 추론 :
%g
과학적 표기법을 제거하지 않습니다.
>>> '%g' % 0.000035
'3.5e-05'
소수 자릿수 15 자리는 이상한 행동을 피하는 것으로 보이며 내 요구에 충분한 정밀도를 가지고 있습니다.
>>> ('%.15f' % 1.35).rstrip('0').rstrip('.')
'1.35'
>>> ('%.16f' % 1.35).rstrip('0').rstrip('.')
'1.3500000000000001'
format(inputValue, '.15f').
대신 사용할 수는 '%.15f' % inputValue
있지만 조금 느립니다 (~ 30 %).
사용할 수는 Decimal(inputValue).normalize()
있지만 몇 가지 문제가 있습니다. 하나, 그것은 훨씬 더 느립니다 (~ 11x). 또한 정확도가 매우 뛰어나지 만 사용할 때 여전히 정밀도 손실이 발생한다는 것을 알았습니다 normalize()
.
>>> Decimal('0.21000000000000000000000000006').normalize()
Decimal('0.2100000000000000000000000001')
>>> Decimal('0.21000000000000000000000000006')
Decimal('0.21000000000000000000000000006')
가장 중요한 것은, 나는 여전히 당신이 거기에 넣은 숫자가 아닌 다른 것으로 끝날 수있는 Decimal
에서 로 변환 할 float
것입니다. 내가 생각하는 Decimal
일을 가장 잘 할 때 산술에서 숙박 Decimal
하고이 Decimal
문자열로 초기화됩니다.
>>> Decimal(1.35)
Decimal('1.350000000000000088817841970012523233890533447265625')
>>> Decimal('1.35')
Decimal('1.35')
Decimal.normalize()
컨텍스트 설정을 사용하여 필요한 것에 대한 정밀도 문제를 조정할 수 있다고 확신 하지만 이미 느린 속도와 어리석은 정밀도가 필요하지 않고 여전히 부동에서 변환하고 정밀도를 잃어 가고 있다는 사실을 고려하면 추구 할 가치가 있다고 생각하지 않습니다.
-0.0이 유효한 부동 소수점 수이므로 가능한 "-0"결과에 대해 걱정하지 않고 어쨌든 드물게 발생하지만 문자열 결과를 가능한 한 짧게 유지하려고합니다. 아주 작은 추가 비용으로 항상 추가 조건을 사용할 수 있습니다.
def floatToString(inputValue):
result = ('%.15f' % inputValue).rstrip('0').rstrip('.')
return '0' if result == '-0' else result
3.14 == 3.140
-그것들은 같은 부동 소수점 숫자입니다. 그 문제에 대해 3.140000은 동일한 부동 소수점 숫자입니다. 처음에는 0이 존재하지 않습니다.