所以我用循环向用户请求一些数字输入。在处理输入之后,数学结果与使用计算器进行的实际数学结果略有不同。它是否以0中断值作为输入,并以某种方式扰乱了我的平均值?
values = []
while True:
m = float(input("Number of shares?, 0 for Exit: "))
n = float(input("Total price of purchase?, 0 for Exit:"))
if m == 0:
break
if n == 0:
break
values.append(m)
sum = n/m
print(sum)
第一件事:
我假设,您想保存交易的奖金(股票*价格(,将此数字放入数组值中,然后您想从数组值 试试这个: 小心!示例:给定m=1.1和n=1.1,并且只有一个事务。产量为1.2100000000000002! 为什么? 避免使用浮动。而是使用替身。如果你在处理货币,永远不要使用浮动/双倍。在python中,如果需要更高的精度,可以使用十进制。 您正在尝试使用浮点运算。大多数现代编程语言使用标准IEEE_754-1985来存储浮点值。在IEEE-754中,有些数字不能精确地表示为浮点值。因为它是二元结构。例如,数字0.1。 1.0作为浮动是: 第一位代表符号。如果为零,则数字为正数。如果是一,则为负数。 -1.0: 符号位之后的8位是指数。指数位之后的23位是尾数。 如果我们在尾数的最高有效位中有一个一,会发生什么? 我们现在有一个1.0+2^-1。这是1.5。 什么是 我们现在有一个1.0+2^-2。这是1.25。 1.1是: 1.0+2^-4+2^-5+2^-8+2^-9+2^-12+2^-13+2^-16+2^-17+2^-20+2^-21+2^-23 即:1.10000002384185791015625单精度可提供约1.10000000。 你可以使用双倍精度。双精度包含64位。符号为1,指数为11,尾数为52位。但是0.1仍然只是一个近似的数字,而不是精确的0.1。sum = n/m # calculates **only** n / m and saves it **only** in the variable sum.
# You overwrite sum every loop.
values = []
while True:
m = float(input("Number of shares?, 0 for Exit: ")) # Caution! It's not a good idea to use a float here!
n = float(input("Total price of purchase?, 0 for Exit:")) # Caution! It's not a good idea to use a float here!
if m == 0:
break
if n == 0:
break
values.append(n * m) # append the price of the transaction into values
print( sum(values) / len(values) ) # gives you the average prize per transaction
简短回答:
答案很长:
0 01111111 00000000000000000000000
1 01111111 00000000000000000000000
0 01111111 10000000000000000000000
0 01111111 01000000000000000000000
0 01111111 00011001100110011001101
解决方案
from decimal import Decimal
values = []
while True:
m = Decimal(input("Number of shares?, 0 for Exit: "))
n = Decimal(input("Total price of purchase?, 0 for Exit:"))
if m == 0:
break
if n == 0:
break
values.append(n * m)
average = sum(values) / len(values)
print(average)