フォーマットの 1 つの方法
evil = {"x": 0.00000000001}
Decimal
の「f」フォーマッタを盗むことです。これは、クロッピングの問題と指数の両方を回避できる唯一の簡単な方法ですが、スペース効率が良くありません。
class FancyFloat(float):
def __repr__(self):
return format(Decimal(self), "f")
それを使用するには、入力を「10 進数化」するエンコーダを作成できます。
class JsonRpcEncoder(json.JSONEncoder):
def decimalize(self, val):
if isinstance(val, dict):
return {k:self.decimalize(v) for k,v in val.items()}
if isinstance(val, (list, tuple)):
return type(val)(self.decimalize(v) for v in val)
if isinstance(val, float):
return FancyFloat(val)
return val
def encode(self, val):
return super().encode(self.decimalize(val))
JsonRpcEncoder().encode(evil)
#>>> '{"x": 0.00000000000999999999999999939496969281939810930172340963650867706746794283390045166015625}'
または、もちろん、10 進数化を関数に移動して、それを前に呼び出すこともできますjson.dumps
。
たとえそれが不自由な方法であっても、それは私がそれを行う方法です。