对bigDecimal的一些探索

  一般直接用简单的double等来做浮点计算可能会因为计算机的浮点运算机制出现一点问题,不符合生活中的计算常识,于是java就给我们包装了大数据类,bigdecimal用于处理浮点数据类。当然也有处理整数的bigInteger类。  

  这个直接看下面的代码就行了。最好传入都用string,这样不会出什么问题,笔者曾经用long等出现问题。

package com.csshu;

import java.math.BigDecimal;

public class Test {
    public static void main(String[] args) {
        long a1 = 4096;
        long a2 = 16;
        long b1 = 24031232;
        long b2 = 15491;
        long c1 = 11292672;
        long c2 = 13360;
        long d1 = 4161536;
        long d2 = 4928;
        
        Test t = new Test();
        String a = t.computeSpeed(a1+"", a2);
        String b = t.computeSpeed(b1+"", b2);
        String c = t.computeSpeed(c1+"", c2);
        String d = t.computeSpeed(d1+"", d2);
        
        String a0 = t.computeFileSize(a);
        String b0 = t.computeFileSize(b);
        String c0 = t.computeFileSize(c);
        String d0 = t.computeFileSize(d);
        
        System.out.println(a0);
        System.out.println(b0);
        System.out.println(c0);
        System.out.println(d0);
    }
    
    /**
     * 计算速度,以字节为单位返回
     * @param size 文件大小 byte
     * @param time 所用时间 millseconds
     * @return
     */
    public String computeSpeed(String size,long time){
        String speed = "";
        BigDecimal bd1 = new BigDecimal(size);
        BigDecimal bd2 = new BigDecimal(time+""); // long直接传进来要出问题,5637可能变成5.637
        bd2 = bd2.divide(new BigDecimal(1000+"")); // 变成以秒为单位
        System.out.println(bd2.toString());
        BigDecimal bd3 = bd1.divide(bd2, 2, BigDecimal.ROUND_HALF_EVEN);
        speed  = bd3.toString();
        return speed;
    }
    
    /**
     * 计算文件大小,要求输入以byte为单位的大小。如果超过TB则返回""
     * @param fileSize
     * @return
     */
    public String computeFileSize(String fileSize){
        String fileSizeString = "";
        BigDecimal bd1 = new BigDecimal(fileSize);
        BigDecimal bd2 = new BigDecimal(1024);
        double d = Double.valueOf(fileSize);
        if(d < 1024){ // B
            fileSizeString = fileSize+"B/s";
        }else if(d < Math.pow(1024,2)){ // KB   1024B -1KB   1000
            BigDecimal bd3 = bd1.divide(bd2,2,BigDecimal.ROUND_HALF_EVEN);
            fileSizeString = bd3.toString()+"KB/s";
        }else if(d < Math.pow(1024,3)){ // MB
            BigDecimal bd3 = bd1.divide(bd2,2,BigDecimal.ROUND_HALF_EVEN);
            fileSizeString = bd3.toString()+"KB/s";
        }else if (d < Math.pow(1024,4)){ // GB
            BigDecimal bd3 = bd1.divide(bd2,2,BigDecimal.ROUND_HALF_EVEN);
            fileSizeString = bd3.toString()+"KB/s";
        }
        return fileSizeString;
    }
}

 

posted @ 2016-01-26 14:23  likeshu  阅读(188)  评论(0编辑  收藏  举报