在python中,我怎样才能有一个小数点后两位的浮点数(作为一个浮点数)?

pnwntuvh  于 2023-05-02  发布在  Python
关注(0)|答案(4)|浏览(165)

我有一辆花车

x = 2.00

我想把它作为json发送

message = { 'x': 2.00 }

但当我这么做的时候

print(message)

我看到Python删除了最后一个小数位。我怎样才能把浮点数保持在小数点后两位?我明白2。00和2.0并没有什么不同,但它是一个要求,我发送的确切数字(两个小数位包括在内)(我已经尝试了Decimal类,它仍然表现相同,我需要发送它作为一个浮动而不是字符串)。先谢谢你了。

hvvq6cgz

hvvq6cgz1#

您需要使用一个专门的库来序列化浮点数并保持精度。Protocol Buffers是一个这样的库(协议),您可以定义自己的JSON编码器类:https://developers.google.com/protocol-buffers/docs/proto3

ao218c7q

ao218c7q2#

你可以定义自己的JSON编码器类:

import json

message = {'x': 2.00}

class MyEncoder(json.JSONEncoder):
    def encode(self, obj):

        if isinstance(obj, dict):
            result = '{'
            for key, value in obj.items():
                if isinstance(value, float):
                    encoded_value = format(value, '.2f')
                else:
                    encoded_value = json.JSONEncoder.encode(self, value)

                result += f'"{key}": {encoded_value}, '

            result = result[:-2] + '}'
            return result
        return json.JSONEncoder.encode(self, obj)

print(json.dumps(message, cls=MyEncoder))

输出:

{"x": 2.00}
5cnsuln7

5cnsuln73#

您可以通过以下方式使用自定义JSONEncoder:
1.将数字编码为带有一些周围字符的2dp字符串。
1.使用正则表达式去掉特殊字符和引号。
下面是一个使用Decimal的例子:

from decimal import Decimal
from json import JSONEncoder
import json
import re

def to_json(value: dict) -> str:
    class DecimalEncoder(JSONEncoder):
        def default(self, obj):
            if type(obj) is Decimal:
                return f"Decimal({obj:.2f})"
            else:
                return JSONEncoder.default(self, obj)

    json_string = json.dumps(value, cls=DecimalEncoder)
    json_string = re.sub(r'"Decimal\((.*?)\)"', r"\1", json_string)

    return json_string

before = {
    "amount": Decimal("2.1"),
}

after = to_json(before)

print(before)
print(after)

结果是:

{'amount': Decimal('2.1')}
{"amount": 2.10}
lrpiutwd

lrpiutwd4#

下面是一个例子:

a=2.00
print ("{0:.2f}".format(a))

相关问题