您想要将货币存储在中,long
并以计算货币double
,至少作为备份。您希望所有交易都以进行long
。
您要存储货币的原因long
是,您不想损失任何货币。
假设您使用double
,而您没有钱。有人给您三个角钱,然后将它们取回。
You: 0.1+0.1+0.1-0.1-0.1-0.1 = 2.7755575615628914E-17
好吧,那不是很酷。也许有10美元的人想通过先给你三角钱,然后再给别人$ 9.70来发家致富。
Them: 10.0-0.1-0.1-0.1-9.7 = 1.7763568394002505E-15
然后将它们的钱退还给他们:
Them: ...+0.1+0.1+0.1 = 0.3000000000000018
这是坏的。
现在,让我们使用多头,我们将追踪十分之一美分(因此1 = 0.001美元)。让我们给地球上的每个人十亿,一亿一千一百二十万,七万五千,一百四十三美元:
Us: 7000000000L*1112075143000L = 1 894 569 218 048
嗯,等等,我们可以给每个人超过十亿美元,而只花两点多一点?溢出在这里是一场灾难。
因此,每当您要计算转帐金额时,请使用double
并Math.round
获得long
。然后使用修改余额(增加和减少两个帐户)long
。
您的经济不会泄漏,它将扩大到万亿美元。
还有更多棘手的问题-例如,如果您付款二十次,该怎么办?*-但这应该可以帮助您入门。
*您计算一笔款项,四舍五入为long
; 然后乘以20.0
并检查是否在范围内;如果是这样,您可以将付款20L
金额乘以以从余额中扣除。通常,所有事务都必须以处理long
,因此您确实需要总结所有单个事务;您可以将其作为快捷方式进行乘法,但是您需要确保不添加舍入误差并且不会溢出,这意味着您需要先使用进行检查,double
然后再使用进行真正的计算long
。