提问人:josh139 提问时间:8/4/2022 最后编辑:josh139 更新时间:8/4/2022 访问量:152
在 Python 中应用十进制
Applying Decimal in Python
问:
我正在尝试解决以下问题:
假设一本书的封面价格是 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 美元。由于计算中某处的浮点数问题,我收到了错误的答案并使用它。我已经使用十进制模块进行了查找,但不明白我将如何将其应用于我的问题,任何帮助都不胜感激,谢谢。
答:
您对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
评论
处理金钱时应该使用小数的原因是浮点数不能正确表示所有十进制数。了解每个计算机科学家都应该了解的浮点运算知识
您只需将浮点数定义为 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().prec
9.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
评论
0.4
Decimal('0.4')
Decimal