注意:计算机擅长的是计算不是逻辑判断,计算中移位的效率更高。另外,能不用递归则不用。
该业务数据最大转换到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;
}