いくつかの同様の質問に対する回答を検討した後、これは私にとって最良の解決策のようです:
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()
、これにはいくつかの問題もあります。一つには、それは非常に遅い(〜11倍)です。また、精度は非常に高いものの、を使用すると精度が低下することがわかりました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は同じ浮動小数点数です。そもそもゼロは存在しません。