Number

数字计算之分摊

July 20, 2022
Number
Calculate

背景:分多次把一批货全部出清。

要求:需要确保这批货多次出清跟一次出清收的钱一样。

现有三个数字(可整数,可小数):a b c,其中:a 为数量,b 为价格,c 为折扣。

则总额为: t, t = a*b*c

假设分三次,每次数量为:a1 a2 a3,则有:a = a1 + a2 + a3

  1. 直接计算:

第 1 次.

a1*b*c

第 2 次.

a2*b*c

第 3 次.

a3*b*c

(a1+a2+a3)bc 不就等于 abc 了吗?

但是,如果考虑到小数乘法计算时的精度,比如:1.22*2.33 相乘后再取精度(保留两位小数),不就会导致数量误差了吗?

那如果取精度导致结果误差,那我不取精度,直接用所有小数位数来计算呢。

虽说可以,但小数位数是有可能非常多的,占用的空间也是一笔不小的开销。

  1. 引入中间量(可称为’余额’): x y z
x = a
y = x*b
z = y*c

第 1 次.

x1 = (x-a1)
y1 = (y-y*a1/x)
z1 = (z-z*a1/x)
t1 = z*a1/x

第 2 次.

x2 = (x1-a2)
y2 = (y1-y1*a2/x1)
z2 = (z1-z1*a2/x1)
t2 = z1*a2/x1

第 3 次.

...