2017年2月8号 数据统计单位转换(两种实现思路)

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

猜你喜欢

转载自blog.csdn.net/aa1bb1cc2/article/details/61415202
今日推荐