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. Spring Boot 加载application.properties顺序

    1.准备四份application.properties a.项目根目录下config/application.properties ,内容为:  test.user.name = a b.项目根目录 ...

  2. SpringMVC中ModelAndView的两个jar包引起的思考servlet和portlet

    在使用ModelAndView时,需要去导包,但是有两个包. 检查前台form表单提交的也正确,后台这也没有问题. 后来发现竟然时导包导错误了. 到此,如果是因为到错包问题,应该就解决了. 但是,深入 ...

  3. 【总结】sqlserver

    1 基础 1.1 简介 sqlserver是闭源的,必须运行在windows平台上的数据库.默认事务隔离级别是读已提交(commit read).全称Microsoft SQL Server,说以也被 ...

  4. Luogu P6815 [PA2009]Cakes

    题意 给定一个 \(n\) 个点 \(m\) 条边的图,点 \(i\) 有权值 \(a_i\),一个三元环 \((i,j,k)\) 的贡献为 \(\max(a_i,a_j,a_k)\),求所有三元环的 ...

  5. MySQL连接报错(错误:1130)

    1. 原因 显示这个错误是因为没有连接到该机器MySQL数据库的权限,这是在一开始安装MySQL是默认设置的. 在数据库mysql下有一张名为`user`的表,其中的字段user下的root的值默认为 ...

  6. http twisted

    Sunday, September 30th, 2007 Twisted的WEB开发 作者: gashero <harry.python@gmail.com> 目录 1   简介 2    ...

  7. linux查看日志的几种方法

    linux 日志查看 tail.head. cat.tac.sed.less.echo 1.命令格式: tail       [必要参数]     [选择参数]     [文件] -f 循环读取 -q ...

  8. Java_面向对象三大特征

    面向对象特征 面向对象三大特征: 继承, 封装, 多态 继承 继承: 子类可以从父类继承属性和方法 对外公开某些属性和方法 要点(eclipse中Ctrl+T查看继承结构) 1.父类也称超类, 基类, ...

  9. 腾讯开源 APIJSON 连创五个第一

    腾讯第一个码云推荐项目,// 其它最早创建的是 TencentOS-tiny(码云) 2019.8.23 腾讯第一个码云GVP项目,// 其它最早创建的是 TencentOS-tiny(码云) 201 ...

  10. Spider_基础总结3_BeautifulSoup对象+find()+find_all()

    # 本节内容: # 解析复杂的 HTML网页: # 1--bs.find() bs.find_all() tag.get_text() # find_all(tag/tag_list,attribut ...