在 Python 中应用十进制

Applying Decimal in Python

提问人:josh139 提问时间:8/4/2022 最后编辑:josh139 更新时间:8/4/2022 访问量:152

问:

我正在尝试解决以下问题:

假设一本书的封面价格是 24.95 美元,但书店可以享受 40% 的折扣。第一个副本的运费为 3 美元,每增加一个副本的运费为 75 美分。60份的总批发成本是多少?

参考 Nic3500 的旧尝试:

book = 24.95
discount_percentage = 0.4
shipping = 3.0
reduced_shipping = 0.75
quantity = 60

discount = book * discount_percentage
print(discount)
wholesale_price = book - discount
print(wholesale_price)
total_books = wholesale_price * quantity
print(total_books)
total_shipping = shipping + (reduced_shipping * quantity)
print(total_shipping)

cost = total_books + total_shipping

print('$', cost)

参考 Michael Butscher 使用十进制的新尝试:

from decimal import *

getcontext().prec = 2

book = Decimal(24.95)
discount_percentage = Decimal(0.4)
shipping = Decimal(3.0)
reduced_shipping = Decimal(0.75)
quantity = Decimal(60)

discount = book * discount_percentage
print(discount)
wholesale_price = book - Decimal(discount)
print(wholesale_price)
total_books = Decimal(wholesale_price) * quantity
print(total_books)
total_shipping = shipping + (reduced_shipping * (quantity - 1))
print(total_shipping)

cost = Decimal(total_books) + Decimal(total_shipping)

print('$', cost)

然而,问题是答案应该是 945.45 美元。由于计算中某处的浮点数问题,我收到了错误的答案并使用它。我已经使用十进制模块进行了查找,但不明白我将如何将其应用于我的问题,任何帮助都不胜感激,谢谢。

Python 浮点 十进制 精度

评论

0赞 Michael Butscher 8/4/2022
基本上替换像 by 这样的数字并保持计算不变。0.4Decimal('0.4')
0赞 josh139 8/4/2022
如果我在所有操作数上使用 Decimal() 函数和 getcontext().prec = 2 来使用小数点后的 2 个数字,我只收到 9.5E+2,这是错误的答案?
0赞 pho 8/4/2022
如果您尝试使用并遇到问题,您应该展示您尝试过的内容并提出该问题!Decimal

答:

0赞 Nic3500 8/4/2022 #1

您对total_shipping的计算是错误的。它说第一个副本是 3 美元,其他副本是 0.75 美元。所以你应该有.3$ + (59 * 0.75$)

另一件事是你应该你的金额,因为我们不会低于 $ 的 2 位精度。round()

因此:

#!/usr/bin/python3

book = 24.95
discount_percentage = 0.4
shipping = 3.0
reduced_shipping = 0.75
quantity = 60

discount = round(book * discount_percentage,2)
print(discount)

wholesale_price = round(book - discount,2)
print(wholesale_price)

total_books = round(wholesale_price * quantity,2)
print(total_books)

total_shipping = round(shipping + (reduced_shipping * (quantity - 1)),2)
print(total_shipping)

cost = round(total_books + total_shipping,2)

print('$', cost)

输出:

9.98
14.97
898.2
47.25
$ 945.45

评论

1赞 pho 8/4/2022
这个问题问的是“如何应用十进制”,这个问题根本没有解决!
0赞 Nic3500 8/4/2022
他看了看,不明白,我证明这不是必需的。我对我的答案没问题。使用十进制并不能修复逻辑错误。
1赞 pho 8/4/2022 #2

处理金钱时应该使用小数的原因是浮点数不能正确表示所有十进制数。了解每个计算机科学家都应该了解的浮点运算知识

您只需将浮点数定义为 s。您在变量中保存的内容与向用户显示的内容之间存在差异。以更高的精度存储数据是完全可以的,并且只显示两位数。Decimal

当你这样做,并修复 Nic 指出的方程式中的错误时,你就会得到这个

from decimal import Decimal

book = Decimal('24.95')
discount_percentage = Decimal('0.4')
shipping = Decimal('3.0')
reduced_shipping = Decimal('0.75')
quantity = 60

discount = book * discount_percentage
wholesale_price = book - discount
total_books = wholesale_price * quantity
total_shipping = shipping + (reduced_shipping * (quantity - 1))

cost = total_books + total_shipping

print(f'${cost:.2f}')

哪些输出$945.45

请注意,我使用了 f 字符串将输出格式化为小数点后 2 位。您可以在 https://realpython.com/python-f-strings/ 中阅读有关 f-string 语法的更多信息


设置的问题在于它限制了可用于所有十进制运算的有效数字的数量。 是两位有效数字decimal.getcontext().prec9.5e+2

from decimal import Decimal, getcontext

getcontext().prec = 2
d1 = Decimal('1234.56')
d2 = d1 + 1
print(d2) # 1.2E+3

如果要将小数点四舍五入到固定的小数位数,请使用以下方法:quantize

TWO_DECIMALS = Decimal('0.01')
print(cost.quantize(TWO_DECIMALS)) # Prints 945.45