在商业计算中(尤其是计算价格)需要使用BigDecimal类来进行精确小数计算,因为用其他类型计算(如double)得到的结果不是精确的!

写个测试类。

import org.junit.Test;
import java.math.BigDecimal; public class BigDecimalTest { @Test
public void test1(){
System.out.println(0.05 + 0.01); // 0.060000000000000005
System.out.println(1 - 0.42); // 0.5800000000000001
System.out.println(4.015 * 100); // 401.49999999999994
System.out.println(123.3 / 100); // 1.2329999999999999
} @Test
public void test2(){
BigDecimal b1 = new BigDecimal(0.05);
BigDecimal b2 = new BigDecimal(0.01);
System.out.println(b1.add(b2)); // 0.06000000000000000298372437868010820238851010799407958984375
} @Test
public void test3(){
BigDecimal b1 = new BigDecimal("0.05");
BigDecimal b2 = new BigDecimal("0.01");
System.out.println(b1.add(b2)); // 0.06
}
}

小结一:关于BigDecimal类的使用方法。

  • System.out.println()中的数字默认是double类型的,double类型小数计算不精准。
  • 使用BigDecimal类构造方法传入double类型时,计算的结果也是不精确的!必须改用传入String的构造方法。这一点在BigDecimal类的构造方法注释中有说明。
  • 实际项目中,数据库存的通常是float或double类型,所以计算时需要频繁进行转换,通常需要单独封装一个转换方法。

封装一个工具类BigDecimalUtil.java

import java.math.BigDecimal;

public class BigDecimalUtil {

    // 私有构造方法,防止外部new
private BigDecimalUtil(){} // 加法。
public static BigDecimal add(double v1, double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2);
} // 减法。
public static BigDecimal sub(double v1, double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2);
} // 乘法。
public static BigDecimal mul(double v1, double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2);
} // 除法。
public static BigDecimal div(double v1, double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP); // 四舍五入,保留2位小数
}
}

小结二:关于JUnit单元测试的使用方法。

  • 新建一个类做单元测试,通常在目录“项目名/src/test/java/”下。
  • 编写测试方法,标注上@Test,即可右键运行该测试方法,而不需要写主函数调用。

【Java】使用BigDecimal类进行精确小数计算的更多相关文章

  1. java.math.BigDecimal类

    BigDecimal类用于高精度计算.一般的float型和Double型数据只可以用来做科学计算或者是工程计算,由于在商业计算中,要求的数字精度比较高,所以要用到java.math.BigDecima ...

  2. Java中BigDecimal类介绍及用法

    Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算. 其中 BigInteger 类是 ...

  3. java基础-BigDecimal类常用方法介绍

    java基础-BigDecimal类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigDecimal类概述 我们知道浮点数的计算结果是未知的.原因是计算机二进制 ...

  4. java用double和float进行小数计算精度不准确

    java用double和float进行小数计算精度不准确 大多数情况下,使用double和float计算的结果是准确的,但是在一些精度要求很高的系统中或者已知的小数计算得到的结果会不准确,这种问题是非 ...

  5. java.math.BigDecimal类multiply的使用

    java.math.BigInteger.multiply(BigInteger val) 返回一个BigInteger,其值是 (this * val).声明 以下是java.math.BigInt ...

  6. BigDecimal 执行精确小数计算

    来考虑这样一种情况,先来看代码: public class Test { public static void main(String[] args) { System.out.println(0.4 ...

  7. java.math.BigDecimal保留两位小数,保留小数,精确位数

    http://blog.csdn.net/yuhua3272004/article/details/3075436 使用java.math.BigDecimal工具类实现   java保留两位小数问题 ...

  8. 商业计算中Java高精度计算BigDecimal类

    <Effective Java> 第48条:如果需要精确的答案,请避免使用float和double. 如果我们编译运行下面这个程序会看到什么?public class Test{    p ...

  9. Java API —— BigDecimal类

    1.BigDecimal类概述  由于在运算的时候,float类型和double很容易丢失精度,演示案例.所以,为了能精确的表示.计算浮点数,Java提供了BigDecimal 不可变的.任意精度的有 ...

随机推荐

  1. list、map、数组 转换

    list,set,map,数组间的相互转换1.list转setSet set = new HashSet(new ArrayList()); 2.set转listList list = new Arr ...

  2. C++11 中值得关注的几大变化(详解)

    源文章来自前C++标准委员会的 Danny Kalev 的 The Biggest Changes in C++11 (and Why You Should Care),赖勇浩做了一个中文翻译在这里. ...

  3. ios开发中用过的一些外部库总结 cocoapods list

    下面几个库是在之前的一个ios app开发中使用过的一些外部库: 1. zbar :2. shakebox :3. processbar :4. tableviewcontroller :新版的sta ...

  4. [转]Intellij IDEA快捷键与使用小技巧

    Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时按 “!”键Ctrl+E,最近的文件Ctrl+Shift+E,最近更改的文件Shift+Click,可以关闭文件Ctrl+[ ...

  5. centos 7 执行 groupinstall报错

    报错显示Error: Package: systemtap-devel-3.10-10.el7.armv7hl (base) Requires: kernel-devel 解决方案 wget http ...

  6. MySQL的体系结构图

    http://attachbak.dataguru.cn/attachments/forum/201408/30/231337wrbs3xpr5kbs3ryh.png

  7. MySql(十三):MySql架构设计——可扩展性设计之 MySQL Replication

    一.前言 MySQL Replication能够将一个 MySQL Server 的 Instance 中的数据完整的复制到另外一个 MySQL Server 的 Instance 中.虽然复制过程并 ...

  8. activiti设置流程变量

    public static void mian(String args[]){ ProcessEngine processEngine  = ProcessEngine.getDefaultProce ...

  9. Android 推送集成华为,小米,友盟

    公司的 app 一直使用的是极光推送,最近反馈比较多的是推送消息收不到,看来需要找新的推送服务了,在国内目前手机品牌占有率比较多的是华为和小米,且这两家都有自己的推送服务,同时一个合作的友商说他们使用 ...

  10. win2016安装postgresql安装不了的问题

    我在阿里云的win2016服务器上下载postgresql,结果怎么都装不上. 双击 Exe没有 任何 反映 .. ... 网上搜索不出..在N个群里问 ,终于碰到有人和我一样的问题了..原来是阿里云 ...