我想计算一些浮动的平均和.但我得到了奇怪的结果



所以我用循环向用户请求一些数字输入。在处理输入之后,数学结果与使用计算器进行的实际数学结果略有不同。它是否以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)

第一件事:

我假设,您想保存交易的奖金(股票*价格(,将此数字放入数组中,然后您想从数组

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

小心!示例:给定m=1.1和n=1.1,并且只有一个事务。产量为1.2100000000000002!

为什么?

简短回答:

避免使用浮动。而是使用替身。如果你在处理货币,永远不要使用浮动/双倍。在python中,如果需要更高的精度,可以使用十进制。

答案很长:

您正在尝试使用浮点运算。大多数现代编程语言使用标准IEEE_754-1985来存储浮点值。在IEEE-754中,有些数字不能精确地表示为浮点值。因为它是二元结构。例如,数字0.1

1.0作为浮动是:

0 01111111 00000000000000000000000

第一位代表符号。如果为零,则数字为正数。如果是,则为负数。

-1.0:

1 01111111 00000000000000000000000

符号位之后的8位是指数。指数位之后的23位是尾数。

如果我们在尾数的最高有效位中有一个,会发生什么?

0 01111111 10000000000000000000000

我们现在有一个1.0+2^-1。这是1.5。

什么是

0 01111111 01000000000000000000000

我们现在有一个1.0+2^-2。这是1.25。

1.1是:

0 01111111 00011001100110011001101

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。

解决方案

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) 

相关内容

  • 没有找到相关文章

最新更新