Java资金和比率,如何存储和操纵?

时间:2018-05-28 23:43:14

标签: java currency bigdecimal

我一直试图将使用BigDecimal的实时应用程序重构为使用long的10位十进制数的定点表示,因为它通常是什么建议用Java存储和操纵钱。问题是我还需要处理比率(汇率,贴现率,百分比等),而且我不确定如何以理智的方式做到这一点。

所以要创建这些小数,我这样做(当然封装在一个类中):

long multiplier = (long) Math.pow(10, precision)
long decimal = 1.2345 * multiplier; // 12345000000

以下是使用此表示的一些基本操作:

long addition       = decimal1 + decimal2;
long subtraction    = decimal1 - decimal2;
long multiplication = (decimal1 * decimal2) / multiplier;
long division       = (decimal1 * multiplier) / decimal2;

正如您所看到的,即使对于小数字,这样的乘法和除法也容易溢出。这极大地减少了这些操作的有效参数范围。

所以有些人可能会问你为什么一开始就需要这个?好吧,要从货币转换为另一种货币,例如:eur=usd*rate,或者获得投资回报:roi=profit/investment

获得高精度到一定数量的数字和出色的性能(尽可能接近使用原始类型)的真正方法是什么?

2 个答案:

答案 0 :(得分:0)

使用原始类型并储存美分(不是美元/欧元/无论如何)!

这就是银行所做的,也应该做些什么。

在数字中加上小数点是呈现问题;不要让渲染影响您的核心数据类型。

{ "items" : { "-LDJak_gdBhZQ0NSB-7B" : { //item "name" : "Test123", ... }, ... }, "likes" : { "YoTjkR2ORlcr5hGedzQs5xOK2VE3" : { //user "-LDJiY0YSraa_RhxVWXL" : true //whether or not the item is liked }, ... } } 美分将准确地保持全球总债务数千倍 - 它足以保留您将遇到的任何价值。

答案 1 :(得分:-1)

你的问题没有意义。

  1. 你只能用标量来赚钱。将两个金额相乘是没有意义的。你到底想要什么?方钱?
  2. 将金额除以另一个的结果不是金额。它是一个比率,例如汇率。
  3. 注意,long持有超过10位十进制数字。更像20手。