假设我有两个小数 a 和 b,每个都有两位小数。我现在想确定一个因子 x,乘以 a,得到 b。这是 x = b / a
有什么方法可以计算 b = a * x 的结果精确到小数点后两位(不四舍五入)所需的最小小数位数吗?
示例:
a = 76,33
b = 44,12
x1 = 0,5780165072710599 (16 decimal places)
b1 = 76,33 * 0,5780165072710599
b1 = 44,120000000000002167
x2 = 0,578016507271059 (15 decimal places)
b2 = 76,33 * 0,578016507271059
b2 = 44,11999999999993347
x3 = 0,57801650727106 (14 decimal places; rounded)
b3 = 76,33 * 0,57801650727106
b3 = 44,1200000000000098
x4 = 0,5780 (4 decimal places; rounded like GAAP)
b4 = 76,33 * 0,5780
b4 = 44,11874
x5 = 0,5781 (4 decimal places; corrected, not rounded)
b5 = 76,33 * 0,5781
b5 = 44,126373 (it's 44,12* now, but far more away from 44,120 than the previous 44,11874)
“公认会计原则 (GAAP)”建议保留四位小数,以抵消舍入误差。然而,就我而言,我发现在求和和乘以大量数字时,这会导致严重的舍入问题。
以 b4 = 44,11874 为例,现在预订该仓位的 1.000.000 倍。您最终得到 44.118.740。如果 b1 = 44,120000000000002167,总和将为 44.120.000。差异已经是 1.260,这已经对货币金额产生了影响。
是否可以计算出安全起见所需的最小小数位数?
您有以下精确的数学方程:
x = b / a
然而,当你四舍五入
x
时,你最终会得到:
x' = x + e
其中
e
是一个错误项。
如果将
x
四舍五入到 k 位小数,则 e
将介于 -1/(2 10^k) 和 +1/(k 10^k) 之间。例如,如果将 x
四舍五入到小数点后 4 位,则 e
将介于 -0.00005 和 +0.00005 之间。
然后,当您尝试使用
b
而不是 x'
重新计算 x
时,您会得到一个值 b'
,其中也有一个错误项:
b' = a x' = a x + a e = b + a e
b'
上的错误项现在是 a e
。
因此,如果您希望
b'
上的误差项最多为 1 / 200,以便 b'
四舍五入到 b
小数点后两位,那么您需要 x'
上的误差项最多为 1 /(200 个)。
在大多数示例中,
a
始终小于 100,因此四舍五入到小数点后 4 位就很好了。
但在最后一个示例中,
a
是 1000000,因此 x
需要 8 位小数。