人間が表示する浮動小数点数の書式を扱うインプレースコードを扱っています。Python書式の文字列と浮動小数点表現
現在の実装では、この処理を行います。
理にかなっていると、ほとんどの部分だけで正常に動作し"{0:.24f}".format(some_floating_point).rstrip('0')
。しかし、0.0003
のような値に直面したときには、うまくいっていません。
>>> "{0:.24f}".format(0.0003).rstrip('0')
'0.000299999999999999973719'
さらに調査したところ、Pythonは要求された桁数に基づいて基礎となる表現を変更しているようです。
>>> "{0:.15f}".format(0.0003)
'0.000300000000000'
>>> "{0:.20f}".format(0.0003)
'0.00029999999999999997'
私の前提は単精度対doubleです。
ユーザーは、データベースに格納されている場所でこれらの値をdoubleとして入力し、後でフォームを再度レンダリングするときに、フィールドに同じ値が事前入力されます。したがって、これらの表現の1:1マッピングが必要です。
私の質問は次のようなものです:この行動に対処するための、よりエレガントで安全な方法は何ですか?これまでの私の最善の努力はlog10に関わってきており、それをきちんと置くのに理想的ではありません。
編集:プルーンは値が実際には変化していないと指摘していますが、フォーマットで行われた丸めは9のセットを0にします。その行動は意味をなさないが、解決策はまだ私を逃げている。
は、このエレガントな解決策はありません、それは私が答えを提供できるベース2とベース10との違いに固有のだが、それはあまりにもlog10のを必要とする - あなたはの桁数を制限する必要があります形式は、倍精度浮動小数点(Double)に格納されている有効桁数より1少ない数になります。 –