注意:计算机擅长的是计算不是逻辑判断,计算中移位的效率更高。另外,能不用递归则不用。
该业务数据最大转换到T(单位可扩张,第一种实现思路的限制在BigDecimal能支持的大小,第二种实现限制在语言本身或者说没有限制)为单位
思路:
逢1024进一个单位(借鉴进制思想,这里可以随意设置,只是我的代码不支持,当时没考虑这个),但是注意BigInteger除法是取整运算,所以不能直接以BigInteger类型的数据直接计算,而是用BigDecimal做计算。注意:代码中的注释部分
另一种做法(使用范围广,能处理的数据更大):数组模拟大数四则运算。Java实现不受数组长度限制,只要内存足够便可以开到足够大。但是Java这种高级语言的时间效率相对C语言较低,大概是3倍关系。但是C语言数组有长度限制(C的最大数组大小为10W,不过这个长度依然够用)。另外使用C语言时注意
初始化
(一定要注意,否则付出血的代价)。C语言不支持类似Java的所谓类型的自动转换,不要在C中做类型长度的扩张,否则就算做了初始化一样会出错(eg:以%64I的形式输出int类型的数据)。
好吧,Java的BigDecimal是数组模拟的(去源码扫一眼,如果是这样那么它就没什么长度限制)。不用写了。
/**
* 获取汇聚数据量 2017年2月8号 修改
* @param Map<String,BigInteger> kpiMeasures
* @param KpiModel kpiModel
* @return kpiModel
* */
public
KpiModel getDatasizeCount(Map<String,BigInteger> kpiMeasures) {
KpiModel kpiModel =
new
KpiModel();
try
{
kpiModel.setKpiCode(
"datasizeCount"
);
kpiModel.setKpiName(
"汇聚数据量"
);
final
char
[] dataUnit =
new
char
[] {
'B'
,
'K'
,
'M'
,
'G'
,
'T'
};
String datasizeCountStr = String.valueOf(kpiMeasures.get(
"datasizeCount"
));
//注意:必须用String.valueOf()方法转换,否则会报类型转换错误
BigDecimal result =
new
BigDecimal(datasizeCountStr);
final
BigDecimal unit = BigDecimal.valueOf(
1024
);
int
index =
0
;
while
(result.compareTo(unit) >
0
&& index <
4
) {
index ++;
result = result.divide(unit,
2
, BigDecimal.ROUND_HALF_UP);
}
kpiModel.setKpiUnit(dataUnit[index] +
""
);
kpiModel.setKpiValue(String.valueOf(result));
}
catch
(Exception e) {
e.printStackTrace();
}
return
kpiModel;
}