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. k8s各组件启动时, -v参数指定的日志级别

    k8s 相关组件启动时 -v参数指定的日志级别 --v=0 Generally useful for this to ALWAYS be visible to an operator. --v=1 A ...

  2. CSS动画之动画模块

    过渡模块和动画模块的区别:过渡动画需要人为的去触发这个反应,而动画模块不需要人为相同点:都是动画:都是系统新增的属性:都是要满足三要素才有动画效果三要素:1.告诉系统执行哪个动画,要写出动画名称:an ...

  3. Java创建二叉树、二叉树的遍历

    创建二叉树: public class Node {     // 左子节点     public Node leftNode;     // 右子节点     public Node rightNo ...

  4. Linux下的django项目01

    1.初始化项目结构 └─shiyanlou_project # 项目根路径 │ .gitignore     # 提交git仓库时,不提交的文件必须要在这里进行标注 │ README.en.md # ...

  5. .NET Core如何进行请求转发?

    前言 冒个泡,近日,有关注我公众号的小伙伴私信我,遇到一个问题搞了很久没解决,此问题具有参考意义,这里跟大家分享下,希望对后续可能有需要的你能有所参考和帮助. 请求转发问题 内网环境跟外网隔离,现在外 ...

  6. react 实现组件嵌套以及子组件与父组件之间的通信

    当子组件触发onChange事件时,实际调用的是父组件中的handelSelect函数,通俗来说就是父组件通过属性handleSelect实现与子组件之间的通信. 父组件:SignupForm 子组件 ...

  7. Scrapy分布式爬虫,分布式队列和布隆过滤器,一分钟搞定?

    使用Scrapy开发一个分布式爬虫?你知道最快的方法是什么吗?一分钟真的能 开发好或者修改出 一个分布式爬虫吗? 话不多说,先让我们看看怎么实践,再详细聊聊细节~ 快速上手 Step 0: 首先安装 ...

  8. Azure Data Factory(四)集成 Logic App 的邮件通知提醒

    一,引言 上一篇有介绍到使用Azure Data Factory 复制数据,然后有集成 Azure DevOps 实现CI/CD,但是对于真正的项目来说,这些肯定是不够的,比如说在执行 Azure P ...

  9. vue 格式化日期

    cnpm install moment --save 摘自:https://www.cnblogs.com/zwq20134/p/11718034.html <el-table-column l ...

  10. vim编辑器的常用命令

    按ESC键跳到命令模式,然后::w - 保存文件,不退出 vim.:w file -将修改另外保存到 file 中,不退出 vim.:w! -强制保存,不退出 vim .:wq -保存文件,退出 vi ...