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

    xiaoxiao2021-03-25  42

    注意:计算机擅长的是计算不是逻辑判断,计算中移位的效率更高。另外,能不用递归则不用。 该业务数据最大转换到T(单位可扩张,第一种实现思路的限制在BigDecimal能支持的大小,第二种实现限制在语言本身或者说没有限制)为单位 思路: 逢1024进一个单位(借鉴进制思想,这里可以随意设置,只是我的代码不支持,当时没考虑这个),但是注意BigInteger除法是取整运算,所以不能直接以BigInteger类型的数据直接计算,而是用BigDecimal做计算。注意:代码中的注释部分 另一种做法(使用范围广,能处理的数据更大):数组模拟大数四则运算。Java实现不受数组长度限制,只要内存足够便可以开到足够大。但是Java这种高级语言的时间效率相对C语言较低,大概是3倍关系。但是C语言数组有长度限制(C的最大数组大小为10W,不过这个长度依然够用)。另外使用C语言时注意 初始化 (一定要注意,否则付出血的代价)。C语言不支持类似Java的所谓类型的自动转换,不要在C中做类型长度的扩张,否则就算做了初始化一样会出错(eg:以dI的形式输出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;      }
    转载请注明原文地址: https://ju.6miu.com/read-27564.html

    最新回复(0)