对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; } }