一般直接用简单的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;
}
}

对bigDecimal的一些探索的更多相关文章

  1. BigDecimal setScale()设置无效 scale()取得的值不是setScale()设置的值

    最近查看rebate数据时,发现一个bug,主要现象是,当扣款支付宝的账号款项时,返回的是数字的金额为元,而数据库把金额存储为分,这中间要做元与分的转化,这个转化规则很简单,就是*100的,所以一开始 ...

  2. Elasticsearch 在地理信息空间索引的探索和演进

    vivo 互联网服务器团队- Shuai Guangying 本文梳理了Elasticsearch对于数值索引实现方案的升级和优化思考,从2015年至今数值索引的方案经历了多个版本的迭代,实现思路从最 ...

  3. 【探索】机器指令翻译成 JavaScript

    前言 前些时候研究脚本混淆时,打算先学一些「程序流程」相关的概念.为了不因太枯燥而放弃,决定想一个有趣的案例,可以边探索边学. 于是想了一个话题:尝试将机器指令 1:1 翻译 成 JavaScript ...

  4. 【探索】利用 canvas 实现数据压缩

    前言 HTTP 支持 GZip 压缩,可节省不少传输资源.但遗憾的是,只有下载才有,上传并不支持.如果上传也能压缩,那就完美了.特别适合大量文本提交的场合,比如博客园,就是很好的例子. 虽然标准不支持 ...

  5. 探索C#之6.0语法糖剖析

    阅读目录: 自动属性默认初始化 自动只读属性默认初始化 表达式为主体的函数 表达式为主体的属性(赋值) 静态类导入 Null条件运算符 字符串格式化 索引初始化 异常过滤器when catch和fin ...

  6. Mysql事务探索及其在Django中的实践(二)

    继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...

  7. Linux学习之探索文件系统

    Linux,一起学习进步-    ls With it, we can see directory contents and determine a variety of important file ...

  8. 马里奥AI实现方式探索 ——神经网络+增强学习

    [TOC] 马里奥AI实现方式探索 --神经网络+增强学习 儿时我们都曾有过一个经典游戏的体验,就是马里奥(顶蘑菇^v^),这次里约奥运会闭幕式,日本作为2020年东京奥运会的东道主,安倍最后也已经典 ...

  9. C++随笔:.NET CoreCLR之GC探索(4)

    今天继续来 带大家讲解CoreCLR之GC,首先我们继续看这个GCSample,这篇文章是上一篇文章的继续,如果有不清楚的,还请翻到我写的上一篇随笔.下面我们继续: // Initialize fre ...

随机推荐

  1. Android 线程优先级

    对于Android平台上的线程优先级设置来说可以处理很多并发线程的阻塞问题,比如很多无关紧要的线程会占用大量的CPU时间,虽然通过了MultiThread来解决慢速I/O但是合理分配优先级对于并发编程 ...

  2. Android批量插入数据到SQLite数据库

    Android中在sqlite插入数据的时候默认一条语句就是一个事务,因此如果存在上万条数据插入的话,那就需要执行上万次插入操作,操作速度可想而知.因此在Android中插入数据时,使用批量插入的方式 ...

  3. [转]ASP.NET MVC 入门8、ModelState与数据验证

    ViewData有一个ModelState的属性,这是一个类型为ModelStateDictionary的ModelState类型的字典集合.在进行数据验证的时候这个属性是比较有用的.在使用Html. ...

  4. [Jacky] 解决Ext.Net GridPanel 选择的行数据刷新后不能获取最新值

    选择GridPanel中一行数据,当变更数据时并重新刷新之后不能获取最新值,需通过如下方式获取: var internalId = gridPanel.getSelectionModel().getL ...

  5. javaweb之servlet 全解

    ①Servlet概述 ⑴什么是Servlet Servlet是JavaWeb的三大组件之一,它属于动态资源.Servlet的作用是处理请求, 服务器会把接收到的请求交给Servlet来处理,在Serv ...

  6. Java和C++的区别

    这是一个Java语言和C++语言之间的比较. 目录 [隐藏]  1 设计目标 2 语言特性 2.1 语法 2.2 语义 2.3 资源管理 2.4 库 2.5 运行时 2.6 模板 vs. 泛型 2.7 ...

  7. NOIP2000 单词接龙

    题三.  单词接龙                (27分)    问题描述    单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的 ...

  8. sed写的命令收集

    1. 替换一行字符串. <title name= > <param name="root", value="haha"/> <pa ...

  9. redis命令之lrange

    LRANGE key start stop Related commands BLPOP BRPOP BRPOPLPUSH LINDEX LINSERT LLEN LPOP LPUSH LPUSHX ...

  10. glusterfs repo

    Installing Gluster For RPM based distributions, if you will be using InfiniBand, add the glusterfs R ...