0

0

Java BigDecimal类应用实例代码解析

WBOY

WBOY

发布时间:2023-04-20 18:25:08

|

1417人浏览过

|

来源于亿速云

转载

一.介绍

 float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,这时候bigdecimal就派上大用场啦。

二.知识点介绍

三.知识点详解

1、概述

为什么要用BigDecimal?

 代码演示:

package com.Test;

import Test2.MyDate;
import java.awt.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Properties;

public class Main {
private final static String name = "磊哥的java历险记-@51博客";
public static void main(String[] args) {
System.out.println(0.2 + 0.1);
System.out.println(0.3 - 0.1);
System.out.println(0.2 * 0.1);
System.out.println(0.3 / 0.1);
System.out.println("============="+name+"=============");
}
}

java BigDecimal类应用实例代码分析

你认为你看错了,但结果却是是这样的。问题在哪里呢?原因在于我们的计算机是二进制的。浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。如:2.4的二进制表示并非就是精确的2.4。反而最为接近的二进制表示是 2.3999999999999999。浮点数的值实际上是由一个特定的数学公式计算得到的。

其实java的float只能用来进行科学计算或工程计算,在大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算。

2、BigDecimal构造方法

  • (1)public BigDecimal(double val):将double表示形式转换为BigDecimal(注:不建议使用)

  • (2)public BigDecimal(int val):将int表示形式转换成BigDecimal

  • (3)public BigDecimal(String val):将String表示形式转换成BigDecimal

为什么不建议采用第一种构造方法呢?

代码演示:

package com.Test;

import Test2.MyDate;

import java.awt.*;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Properties;

public class Main {

private final static String name = "磊哥的java历险记-@51博客";

public static void main(String[] args){
BigDecimal bigDecimal =new BigDecimal(2);
BigDecimal bDouble = new BigDecimal(2.3);
BigDecimal bString = new BigDecimal("2.3");
System.out.println("bigDecimal="+ bigDecimal);
System.out.println("bDouble="+ bDouble);
System.out.println("bString="+ bString);
System.out.println("============="+name+"=============");
}
}

运行结果如下:

java BigDecimal类应用实例代码分析

为什么会出现这种情况呢?

3、源码的描述

 参数类型为double的构造方法的结果有一定的不可预知性。有人可能认为在Java中写入newBigDecimal(0.1)所创建的BigDecimal正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等0.100000000000000005551115123

1257827021181583404541015625。这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。

另一方面,String 构造方法是完全可预知的:写入newBigDecimal("0.1") 将创建一个 BigDecimal,它正好等于预期的 0.1。因此,比较而言,通常建议优先使用String构造方法。 

    当double必须用作BigDecimal的源时,请使用Double.toString(double)转成String,然后使用String构造方法,或使用BigDecimal的静态方法valueOf

代码演示:

package com.Test;
import Test2.MyDate;
import java.math.BigDecimal;
public class Main {
private final static String name = "磊哥的java历险记-@51博客";
public static void main(String[] args) {
BigDecimal bDouble1 =BigDecimal.valueOf(2.3);
BigDecimal bDouble2 = new BigDecimal(Double.toString(2.3));
System.out.println("bDouble1="+ bDouble1);
System.out.println("bDouble2="+ bDouble2);
System.out.println("============="+name+"=============");
}
}

 结果如下:

java BigDecimal类应用实例代码分析

4、BigDecimal加减乘除运算

对于常用的加,减,乘,除,BigDecimal类提供了相应的成员方法。

  • (1)  public   BigDecimal add(BigDecimal value);加法

  • (2)  public   BigDecimal subtract(BigDecimal value); //减法 

  • (3)  public    BigDecimal multiply(BigDecimal value); //乘法                  (4)  public   BigDecimal divide(BigDecimal value);除法

    《PHP技术内幕》中文版
    《PHP技术内幕》中文版

    本书详细说明了PHP的使用方法,内容涉及PHP应用的各个方面,并提供了大量的代码实例,使读者能够快速而容易地学会PHP。每一章都分为两部分,前一部分“深入分析”详细说明相关的技术信息,

    下载

代码演示:

package com.Test;
import Test2.MyDate;
import java.math.BigDecimal;
public class Main {
private final static String name = "磊哥的java历险记-@51博客";
public static void main(String[] args){
BigDecimal a = new BigDecimal("4.5");
BigDecimal b = new BigDecimal("1.5");
System.out.println("a+ b =" + a.add(b));
System.out.println("a- b =" + a.subtract(b));
System.out.println("a* b =" + a.multiply(b));
System.out.println("a/ b =" + a.divide(b));
System.out.println("============="+name+"=============");
}
}

java BigDecimal类应用实例代码分析

这里有一点需要注意的是除法运算divide.

 BigDecimal除法可能出现不能整除的情况,比如 4.5/1.3,这时会报错java.lang.ArithmeticException:Non-terminating decimal expansion; no exact representable decimal result.

 其实divide方法有可以传三个参数:

 public BigDecimal divide(BigDecimal divisor, int scale, introundingMode)     第一参数表示除数, 第二个参数表示小数点后保留位数,   第三个参数表示舍入模式,只有在作除法运算或四舍五入时才用到舍入模式,有下面这几种

  • (1)ROUND_CEILING    //向正无穷方向舍入 

  • (2)ROUND_DOWN    //向零方向舍入 

  • (3)ROUND_FLOOR    //向负无穷方向舍入 

  • (4)ROUND_HALF_DOWN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5 

  • (5)ROUND_HALF_EVEN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN 

  • (6)ROUND_HALF_UP    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6 

  • (7)ROUND_UNNECESSARY    //计算结果是精确的,不需要舍入模式 

  • (8)ROUND_UP    //向远离0的方向舍入

按照各自的需要,可传入合适的第三个参数。四舍五入采用 ROUND_HALF_UP

需要对BigDecimal进行截断和四舍五入可用setScale方法,例:

代码演示:

public static void main(String[] args) {
BigDecimal a = newBigDecimal("4.5635");
//保留3位小数,且四舍五入
a = a.setScale(3,RoundingMode.HALF_UP);
System.out.println(a);
}
注:减乘除其实最终都返回的是一个新的BigDecimal对象,因为BigInteger与BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象

代码演示:

package com.Test;
import Test2.MyDate;
import java.math.BigDecimal;
public class Main {
private final static String name = "磊哥的java历险记-@51博客";
public static void main(String[] args){
BigDecimal a = new BigDecimal("4.5");
BigDecimal b = new BigDecimal("1.5");
a. add(b);
System.out.println(a); //输出4.5. 加减乘除方法会返回一个新的
System.out.println("============="+name+"=============");
}
}

java BigDecimal类应用实例代码分析

5、总结

  • (1)商业计算使用BigDecimal。

  •  (2)尽量使用参数类型为String的构造函数。

  • (3)BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产wf 所以在做加减乘除运算时千万要保存操作后的值。

  •  (4)我们往往容易忽略JDK底层的一些实现细节,导致出现错误,需要多加注意。

6、精炼练习

在银行结算或支付中,我们经常会用到BigDecimal的相关方法。

6.1  题目
  • (1)使用BigDecimal创建出浮点类型的数字

  • (2)使用BigDecimal进行加减乘除运算   

6.2 实验步骤
  • (1)声明一个类Test

  • (2)在Test类中,完成BigDecimal的构造和方法使用

代码演示:

package com.Test;
import Test2.MyDate;
import java.math.BigDecimal;
public class Main {
private final static String name = "磊哥的java历险记-@51博客";
public static void main(String[] args){
BigDecimal number = new BigDecimal("3.14");
//加法
System.out.println(number.add(new BigDecimal("1")));
//减法
System.out.println(number.subtract(new BigDecimal("1")));
//乘法
System.out.println(number.multiply(new BigDecimal("2")));
//除法
System.out.println(number.multiply(new BigDecimal("3.14")));
System.out.println("============="+name+"=============");
}
}

java BigDecimal类应用实例代码分析

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
excel制作动态图表教程
excel制作动态图表教程

本专题整合了excel制作动态图表相关教程,阅读专题下面的文章了解更多详细教程。

20

2025.12.29

freeok看剧入口合集
freeok看剧入口合集

本专题整合了freeok看剧入口网址,阅读下面的文章了解更多网址。

65

2025.12.29

俄罗斯搜索引擎Yandex最新官方入口网址
俄罗斯搜索引擎Yandex最新官方入口网址

Yandex官方入口网址是https://yandex.com;用户可通过网页端直连或移动端浏览器直接访问,无需登录即可使用搜索、图片、新闻、地图等全部基础功能,并支持多语种检索与静态资源精准筛选。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

197

2025.12.29

python中def的用法大全
python中def的用法大全

def关键字用于在Python中定义函数。其基本语法包括函数名、参数列表、文档字符串和返回值。使用def可以定义无参数、单参数、多参数、默认参数和可变参数的函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

16

2025.12.29

python改成中文版教程大全
python改成中文版教程大全

Python界面可通过以下方法改为中文版:修改系统语言环境:更改系统语言为“中文(简体)”。使用 IDE 修改:在 PyCharm 等 IDE 中更改语言设置为“中文”。使用 IDLE 修改:在 IDLE 中修改语言为“Chinese”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

16

2025.12.29

C++的Top K问题怎么解决
C++的Top K问题怎么解决

TopK问题可通过优先队列、partial_sort和nth_element解决:优先队列维护大小为K的堆,适合流式数据;partial_sort对前K个元素排序,适用于需有序结果且K较小的场景;nth_element基于快速选择,平均时间复杂度O(n),效率最高但不保证前K内部有序。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

12

2025.12.29

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

134

2025.12.29

抖音网页版入口在哪(最新版)
抖音网页版入口在哪(最新版)

抖音网页版可通过官网https://www.douyin.com进入,打开浏览器输入网址后,可选择扫码或账号登录,登录后同步移动端数据,未登录仅可浏览部分推荐内容。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

63

2025.12.29

快手直播回放在哪看教程
快手直播回放在哪看教程

快手直播回放需主播开启功能才可观看,主要通过三种路径查看:一是从“我”主页进入“关注”标签再进主播主页的“直播”分类;二是通过“历史记录”中的“直播”标签页找回;三是进入“个人信息查阅与下载”里的“直播回放”选项。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

18

2025.12.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.1万人学习

C# 教程
C# 教程

共94课时 | 5.6万人学习

Java 教程
Java 教程

共578课时 | 39.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号