gpt4 book ai didi

python - Python中十进制值的精确百分比计算

转载 作者:行者123 更新时间:2023-12-02 15:50:53 25 4
gpt4 key购买 nike

我的目标是在 Python 中准确地将 18 位小数的值添加或删除 0.05%,而不将它们转换为 float 。我做了以下两个解决方案,它们对我来说似乎是正确的,但我对 Python 中的数字非常不熟悉,因此我想知道是否有更好的(在准确性方面)解决方案。

price_in_wei = 1000000000000000000 # = 1

# -0.05%
price_with_fee = (price_in_wei/1000)*995

# +0.05%
price_with_fee = (price_in_wei/1000)*1005

# -0.05%
price_with_fee = (price_in_wei*995)/1000

# +0.05%
price_with_fee = (price_in_wei*1005)/1000

最佳答案

我建议您使用 decimal.Decimal 类来使用十进制算术。即使您需要最终结果为整数值,使用十进制算术进行中间计算也会提供更高的准确性。对于您提供的示例,您在第二组计算中所做的工作效果很好,但这只是因为使用了特定的值。如果 price_in_wei 改为 1000000000000000001 会怎么样?您的计算将产生 9.95e+17 或者,如果转换为 int,则为 99500000000000000:

>>> price_in_wei
1000000000000000001
>>> price_with_fee = price_in_wei*995/1000
>>> price_with_fee
9.95e+17
>>> int(price_with_fee)
995000000000000000

但是十进制运算提供了更高的精度:

>>> from decimal import Decimal
>>> price_with_fee = Decimal(price_in_wei) * 995 / 1000
>>> price_with_fee
Decimal('995000000000000000.995')
>>> price_with_fee = int(price_with_fee.quantize(Decimal(1))) # round to an integer and convert to int
>>> price_with_fee
995000000000000001

但假设您的货币是美元,它支持小数点后两位的精度(美分)。如果你想要那个精度,你应该专门使用十进制算术。例如:

>>> from decimal import Decimal, ROUND_HALF_UP
>>> price_in_wei = Decimal('1000000000000000003')
>>> price_with_fee = (price_in_wei * 995 / 1000).quantize(Decimal('1.00'), decimal.ROUND_HALF_UP) # round to two places
>>> price_with_fee
Decimal('995000000000000002.99')

关于python - Python中十进制值的精确百分比计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72508594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com