BigDecimal类

float、double类型的数字在计算的时候,容易发生精度丢失。

使用java.math.BigDecimal类可以解决此类问题。

前面讲过Math类,现在的BigDecimal类所在的包是math包。

注意Math类不在math包中,而是在lang包中。

形如:BigDecimal f3 = new BigDecimal(0.05);

创建BigDecimal类型也有进度偏差,一般——

使用字符串形式构建,或者使用valueOf()方法得到!

使用字符串形式构建,或者使用valueOf()方法得到!!

使用字符串形式构建,或者使用valueOf()方法得到!!!

import java.math.BigDecimal;
public class TestBigDecimal {
public static void main(String[] args) {
System.out.println("---字符串,直接构造---");
BigDecimal f1 = new BigDecimal("0.05");
System.out.println("---浮点型,valueOf(double val)---");
BigDecimal f2 = BigDecimal.valueOf(0.01);
System.out.println("0.05 + 0.01 = " + f1.add(f2));
System.out.println("0.05 - 0.01 = " + f1.subtract(f2));
System.out.println("0.05 * 0.01 = " + f1.multiply(f2));
System.out.println("0.05 / 0.01 = " + f1.divide(f2));
System.out.println("---如果浮点型直接构造,会有误差---");
BigDecimal f3 = new BigDecimal(0.05);
System.out.println(f3);
System.out.println("0.05 + 0.01 = " + f3.add(f2));
}
}

应用:

如果要对浮点型数据进行基本运算,需要先包装成BigDecimal类,在调用相应的方法,最后再转成基本类型的变量,过程比较繁琐。可以自定义一个用于BigDecimal类型运算的工具类。

package ahjava.p04util;
import java.math.*;
/**
*
* <p>
* Description: 定义一个便于BigDecimal操作的工具类
* </p>
*
* @author 虎老狮
* @version 1.0
*/
public class BigDecimalUtil {
// 除法运算精度
private static final int DIV_SCALE = 10;
// 构造器私有,让这个类不能实例化
private TestBigDecimalUtil() {
}
// 提供精确的加法运算。
public static double add(double v1, double v2) {
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.add(b2).doubleValue();
}
// 提供精确的减法运算。
public static double sub(double v1, double v2) {
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.subtract(b2).doubleValue();
}
// 提供精确的乘法运算。
public static double mul(double v1, double v2) {
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.multiply(b2).doubleValue();
}
// 提供(相对)精确的除法运算,当发生除不尽的情况时.
// 精确到小数点以后10位的数字四舍五入。
public static double div(double v1, double v2) {
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
// ROUND_HALF_UP: ___遇到.5时往上近似,例: 1.5 ->2
// ROUND_HALF_DOWN : 遇到.5时往下近似,例: 1.5 ->1
return b1.divide(b2, DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
}
public static void main(String[] args) {
System.out.println("0.05 + 0.01 = " + TestBigDecimalUtil.add(0.05, 0.01));
System.out.println("1.0 - 0.42 = " + TestBigDecimalUtil.sub(1.0, 0.42));
System.out.println("4.015 * 100 = " + TestBigDecimalUtil.mul(4.015, 100));
System.out.println("123.3 / 100 = " + TestBigDecimalUtil.div(123.3, 100));
}
}

四舍五入

BigDecimal类可以进行精确的四舍五入。

setScale(int newScale, int roundingMode)方法可以设置精确到小数点后多少位。

roundingMode设为BigDecimal.ROUND_HALF_UP表示“四舍五入”。

当然还有其他舍入方案,但是不常用,就急这个就够了

import java.math.BigDecimal;
public class 四舍五入 {
public static void main(String[] args) {
BigDecimal d = new BigDecimal("1.12345");
System.out.println(d);
// 精确到小数点后4位
BigDecimal setScale1 = d.setScale(4, BigDecimal.ROUND_HALF_UP);
System.out.println(setScale1);
}
}

运行结果:

1.12345
1.1235

Java基础教程——BigDecimal类的更多相关文章

  1. java基础之BigDecimal类

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

  2. Java基础教程(10)--类

    一.声明类   你已经见过了以如下方式定义的类: class MyClass { // field, constructor, and method declarations }   上面是声明类的最 ...

  3. Java基础教程——File类、Paths类、Files类

    File类 File类在java.io包中.io代表input和output,输入和输出. 代表与平台无关的文件和目录. 可以新建.删除.重命名,但不能访问文件内容. File类里的常量: impor ...

  4. Java基础教程——Date类和Calendar类

    Date类和Calendar类都是关于日期的类,都在java.util包中,使用时需要import. Date java.util.Date类的对象用来表示时间和日期,用得最多的是获取系统当前日期和时 ...

  5. Java基础教程——Scanner类

    Scanner属于java.util包. java.util包是Java内置的一个工具包,其中包含一系列常用的工具类,如处理日期.日历.集合类: 如果要使用到该包中的类,必须显式引入包名:import ...

  6. Java基础教程——RunTime类

    RunTime类 java.lang.RunTime类代表Java程序的运行时环境. 可以进行垃圾回收(gc()),可以进行系统资源清理(runFinalization()): 可以加载文件(load ...

  7. Java基础教程——System类

    System类 java.lang.System类代表当前Java程序的运行平台. |-可以做输入输出,垃圾回收:(此处不讲) |-可以获取时间: |-可以获取环境变量: |-可以获取系统信息: |- ...

  8. Java基础教程——Object类

    Object类 Object类是Java所有类类型的父类(或者说祖先类更合适) <Thinking in Java(Java编程思想)>的第一章名字就叫"everything i ...

  9. Java基础教程——Math类

    Math Java这种级别的编程语言怎么可能没有数学相关的操作呢? java.lang.Math类提供了基本数学运算的方法. 该类是final的,说明不能被继承. 该类的构造方法是私有的(privat ...

随机推荐

  1. 封装APP之详解

    一.什么是封装APP 封装APP又称Web APP,Web APP即是一种框架型APP开发模式(HTML5 APP 框架开发模式),该开发方式拥有跨平台的优势,该模式通常由"HTML5云网站 ...

  2. Redis---06主从复制(薪火相传)

    一.什么是薪火相传模式 上一个slave(从机)是下一个slave(从机)的Master(主机) 二.为什么要这样 优点:从机同样可以接收其他从机的连接和同步请求,那么该从机作为了链条中下一个的主机, ...

  3. Postman测试数据

    一.新增 在controller中编写新增的方法,加上@RequestBody注解,以json格式获取数据 在Postman中,有两种方法新增数据 直接新增参数,如: 以json格式新增 二.删除 根 ...

  4. MongoDB 监控 --- MongoDB基础用法(八)

    MongoDB 监控 在你已经安装部署并允许MongoDB服务后,你必须要了解MongoDB的运行情况,并查看MongoDB的性能.这样在大流量得情况下可以很好的应对并保证MongoDB正常运作. M ...

  5. Luogu P5072 [Ynoi2015]盼君勿忘

    题意 给定一个长度为 \(n\) 的序列 \(a\) 和 \(m\) 次询问,第 \(i\) 次询问需要求出 \([l_i,r_i]\) 内所有子序列去重之后的和,对 \(p_i\) 取模. \(\t ...

  6. CodeForces 1093F Vasya and Array

    题意 给一个长度为 \(n\) 的整数序列 \(a\),其中 \(a_i\) 要么为 \(-1\),要么为 \(1\sim k\) 中的整数. 求出将所有 \(-1\) 替换为 \(1\sim k\) ...

  7. wepack配置

    一.什么是 webpack? webpack是一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都作为模块来使用和处理,它能有Grunt ...

  8. Python爬虫练习(多线程,进程,协程抓取网页)

    详情点我跳转 关注公众号"轻松学编程"了解更多. 一.多线程抓取网页 流程:a.设置种子url b.获取区域列表 c.循环区域列表 d.创建线程获取页面数据 e.启动线程 impo ...

  9. Java中的微信支付(3):API V3对微信服务器响应进行签名验证

    1. 前言 牢记一句话:公钥加密,私钥解密:私钥加签,公钥验签. 微信支付V3版本前两篇分别讲了如何对请求做签名和如何获取并刷新微信平台公钥,本篇将继续展开如何对微信支付响应结果的验签. 2. 为什么 ...

  10. (C#2,.net framework2.0,Visual Studio 2003)之前版本

    (C#2,.net framework2.0,Visual Studio 2003)之前版本归为最初的版本(主要是针对.net framework),其主要定义了最基本的类型.特性. 1.基本的类型 ...