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. 活动可视化搭建系统——你的KPI被我承包了

    前言 对于C端业务偏多的公司来说,在增长.运营等各方同学的摧残下永远绕不过去的一个坑就是大量的H5页面开发,它可能是一个下载.需求告知.产品介绍.营销活动等页面.此类需求都有几个明显的缺点: •开发性 ...

  2. redis方法-

    //链接错误注意 //1.防火墙 //2.配置文件IP绑定 $redis = new Redis(); //连接redis $redis->connect('127.0.0.1', 6379); ...

  3. Java Web中解决乱码的方式

    Java Web中解决乱码的方式 方式一:添加编码过滤器 package com.itmacy.dev.filter; import javax.servlet.*; import javax.ser ...

  4. Mybatis的基础配置

    mybatis相关配置 mybatis核心文件配置的用法以及事例(初级) properties标签:获取外部的配置文件 <properties resource="jdbc.prope ...

  5. SSM实现文件上传

    1.导入上传需要的jar包 commons-fileupload-1.3.3.jar commons-io-2.6.jar 2.创建 index.jsp <%@ page contentType ...

  6. CF1066F Yet another 2D Walking

    DP 由图可以知道优先级相同的点都在一个"7"字形中 所以在走当前的优先级的点时最好从右下的点走到左上的点,或从从左上的点走到右下的点 那记dp[i][0]表示在走完第i个优先级时 ...

  7. Java_进程与线程

    进Process&Thread 区别 进程 线程 根本区别 作为资源分配的单位 调度和执行的单位 开销 每个进程都有独立的代码和数据空间(进程上下文), 进程间的切换会有较大的开销 线程可以看 ...

  8. Sql 解析XML 解决方案

      1.         1.@XML 为数据传入的XML格式 2.         root 为根目录 3.         <A>为对应需要插入的表,详见一对多或者多对多的xml格式 ...

  9. Python爬取B站耗子尾汁、不讲武德出处的视频弹幕

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 前言 耗子喂汁是什么意思什么梗呢?可能很多人不知道,这个梗是出自马保国,经常上网的人可能听说过这个 ...

  10. IP 层收发报文简要剖析4--ip 报文发送

    无论是从本地输出的数据还是转发的数据报文,经过路由后都要输出到网络设备,而输出到网络设备的接口就是dst_output(output)函数 路由的时候,dst_output函数设置为ip_output ...