iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >浅谈Java基础知识之BigDecimal
  • 364
分享到

浅谈Java基础知识之BigDecimal

2024-04-02 19:04:59 364人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、基本使用二、舍入模式三、注意事项四、异常处理 ArithmeticException异常一、基本使用 使用示例: // 初始化 BigDecimal bd1=new Bi

一、基本使用

使用示例:


// 初始化
BigDecimal bd1=new BigDecimal("456");
BigDecimal bd2=new BigDecimal("123");

// 加
BigDecimal add=bd1.add(bd2);
// 减
BigDecimal subtract=bd1.subtract(bd2);  
// 乘
BigDecimal multiply=bd1.multiply(bd2); 
// 除
BigDecimal divide=bd1.divide(bd2);     

// 指数运算, 2 is exponent
BigDecimal powerValue=bd2.pow(2);     

// 四舍五入
multiply.setScale(1, RoundingMode.HALF_EVEN);

二、舍入模式

枚举类 java.math.RoundingMode 定义了8种数据的舍入模式,在 BigDecimal 中,可以用 BigDecimal.setScale(int newScale, RoundingMode roundingMode) 来设置数据的精度和舍入模式。

  • ROUND_UP:向远离零的方向舍入。
  • 若舍入位为非零,则对舍入部分的前一位数字加1;若舍入位为零,则直接舍弃。即为向外取整模式。
  • ROUND_DOWN:向接近零的方向舍入。
  • 不论舍入位是否为零,都直接舍弃。即为向内取整模式。
  • ROUND_CEILING:向正无穷大的方向舍入。
  • BigDecimal 为正,则舍入行为与 ROUND_UP 相同;若为负,则舍入行为与 ROUND_DOWN 相同。即为向上取整模式。
  • ROUND_FLOOR:向负无穷大的方向舍入。
  • BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;若为负,则舍入行为与 ROUND_UP 相同。即为向下取整模式。
  • ROUND_HALF_UP:向“最接近的”整数舍入。
  • 若舍入位大于等于5,则对舍入部分的前一位数字加1;若舍入位小于5,则直接舍弃。即为四舍五入模式。
  • ROUND_HALF_DOWN:向“最接近的”整数舍入。
  • 若舍入位大于5,则对舍入部分的前一位数字加1;若舍入位小于等于5,则直接舍弃。即为五舍六入模式。
  • ROUND_HALF_EVEN:向“最接近的”整数舍入。
  • 若(舍入位大于5)或者(舍入位等于5且前一位为奇数),则对舍入部分的前一位数字加1;
  • 若(舍入位小于5)或者(舍入位等于5且前一位为偶数),则直接舍弃。即为银行家舍入模式。
  • ROUND_UNNECESSARY
  • 断言请求的操作具有精确的结果,因此不需要舍入。
  • 如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。

在这里插入图片描述

三、注意事项

1.大量的数学计算时,使用 基本数据类型 而不是BigIntegerBigDecimal

原因:由于是不可变(immutable)的,在进行每一步运算时,都会产生一个新的对象,引起开销。
建议:应尽量用 long , float , double 等基本类型做科学计算或者工程计算。
设计的目的是用来精确地表示大整数和小数,例如进行金额等比较敏感的数据运算。

2.构造 BigDecimal 时,使用 String 而不是 double

原因:有些数字用 double 根本无法精确表示,传给 BigDecimal 构造方法时就已经不精确了。例如:new BigDecimal(0.1)得到的值是0.1000000000000000055511151231257827021181583404541015625。
建议:使用 new BigDecimal(“0.1”) 得到的值是 0.1。
BigDecimal 有4个构造方法,其中的两个用 BigInteger 构造,一个用 double 构造,一个用 String 构造。

3.比较两个 BigDecimal 值时,使用 compareTo() 而不是 equals()

原因: equals() 方法认为 0.1 和 0.1 是相等的,返回true;认为 0.10 和 0.1 是不等的,返回false。
compareTo() 方法则认为 0.1 与 0.1 相等,0.10 与 0.1 也相等。

4.另外还有一些情形,任意精度的小数运算仍不能表示精确结果。例如,1 除以 9 会产生无限循环的小数 .111111…。
出于这个原因,在进行除法运算时,BigDecimal可以让您显式地控制舍入。

四、异常处理 ArithmeticException异常

在使用BigDecimal数据类型进行计算时,会有三种情况抛出 ArithmeticException,分别是:

1.当除数为 0 时,这种情况比较常见,所以我们在进行除法运算之前先判断下除数是否为 0;

2.如果运算的结果是无线循环的小数,并且在除的时候没有对结果设置精确的位数;
BigDecimal divide 方法结果为无限小数问题 10/3=3.3333333333333333…


public static void main(String[] args) {
	BigDecimal a = new BigDecimal("10");
	BigDecimal o = new BigDecimal("3");
	System.out.print(a.divide(o,2, BigDecimal.ROUND_DOWN).doubleValue());
}

Note:不设置精度范围会出现异常

3.当我们设置了结果的舍入模式是 ROUND_UNNECESSARY 模式时:
如果确保了计算的结果是精确的,则不会抛出异常;否则,就会抛出ArithmeticException 异常。

4.只设置精度(小数点后面的位数,scale),但没有设置舍入模式(roundingModel)时,会不知道如何对小数舍入而报错。
所以在设置精度时要连舍入模式一起设置。


// wrong code
 bd = new BigDecimal(1.5); // is actually 1.4999....
 bd.setScale(1); // throws ArithmeticException
 
 // wright code
 a = new BigDecimal("2.5"); // digit left of 5 is even, so round down
 b = new BigDecimal("1.5"); // digit left of 5 is odd, so round up
 a.setScale(0, BigDecimal.ROUND_HALF_EVEN).toString() // => 2
 b.setScale(0, BigDecimal.ROUND_HALF_EVEN).toString() // => 2

5.指数运算,指数 exponent 为负数时
If you are raising things to negative exponents, you must specify a MathContext in BigDecimal.pow(int, MathContext) so it knows how much precision to use – otherwise, BigDecimal will try to compute it to infinite precision, which is not possible for some values.


//wrong code
BigDecimal powerValue=bd2.pow(-27);// -27 is exponent

到此这篇关于浅谈Java基础知识之BigDecimal的文章就介绍到这了,更多相关Java BigDecimal内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 浅谈Java基础知识之BigDecimal

本文链接: https://www.lsjlt.com/news/125820.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅谈Java基础知识之BigDecimal
    目录一、基本使用二、舍入模式三、注意事项四、异常处理 ArithmeticException异常一、基本使用 使用示例: // 初始化 BigDecimal bd1=new Bi...
    99+
    2022-11-12
  • 浅谈java网络编程基础知识
    这篇文章主要浅谈java网络编程基础知识,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。网络基础知识1、OSI分层模型和TCP/IP分层模型的对应关系这里对于7层模型不展开来讲,只选择跟这次系列...
    99+
    2023-05-30
    java ava
  • 浅谈C++内存管理基础知识
    目录概述c++可用内存c语言的可用内存c++新增内存区域new和malloc智能指针引入智能指针的实现java延伸java语言整体框架java的垃圾回收机制总结 概述 内存管理的原理...
    99+
    2022-11-12
  • Java基础之浅谈hashCode()和equals()
    写在前面 其实很早我就注意到阿里巴巴Java开发规范有一句话:只要重写 equals,就必须重写 hashCode。 我想很多人都会问为什么,所谓知其然知其所以然,对待知识不单止知...
    99+
    2022-11-12
  • java基础之String知识总结
    目录一、概念二、特点三、三种构造方式:四、字符串常量池一、概念 String代表字符串,java语言中所有双引号的字符串都是String的对象,不管是否是new出来的对象。 二、特点...
    99+
    2022-11-12
  • python之基础知识
    1、变量: 2、字符串:用   “  ” 或 ' ' 标注的。 3、列表:[  ] 4、del 和 pop 的区别: 判断何时使用:当从列表中删除元素后不再使用,则del,若后续还使用则pop() 例: #del name =["lele...
    99+
    2023-01-30
    基础知识 python
  • Java基础知识总结之继承
    目录一、继承的基本概念二、继承的好处和弊端三、继承中变量访问的特点四、super关键字五、继承中构造方法的访问特点六、继承中成员方法的访问特点七、方法重写八、包九、修饰符十、stat...
    99+
    2022-11-12
  • 浅谈Python基础之I/O模型
    一、I/O模型 IO在计算机中指Input/Output,也就是输入和输出。由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘、网络等,就需要IO接口。 ...
    99+
    2022-06-04
    浅谈 模型 基础
  • Java基础知识之ByteArrayOutputStream流的使用
    目录Java ByteArrayOutputStream流的使用一、ByteArrayOutputStream流定义二、ByteArrayOutputStream流实例域三、Byte...
    99+
    2022-11-12
  • Java基础知识之注解、元注解
    目录注解注解作用Java预定义的注解自定义注解元注解实例:注解使用总结总结注解 Java注解也称Java标注,是jdk1.5(5.0)后的新特征。Java语言中的类、方法、变量、参数...
    99+
    2022-11-13
  • java基础之泛型知识点总结
    目录一、什么是泛型?为什么要使用泛型? 二、泛型的特性是什么?三、泛型的使用方式 四、Java中的泛型通配符一、什么是泛型?为什么要使用泛型? 泛型,即“参数化...
    99+
    2022-11-12
  • Java基础之位运算知识总结
    目录一、位运算的分类与展现效果二、原理三、边界值测试一、位运算的分类与展现效果 java位运算可以分为左移和右移,其中右移还有无符号右移。   java只对整型位移,可...
    99+
    2022-11-12
  • java基础知识之FileInputStream流的使用
    目录一、File流概念二、FileInputStream1)FileInputStream概念2)构造方法3)FileInputStream常用API三、三种read方法效率比较一、...
    99+
    2022-11-12
  • Java基础知识之StringReader流的使用
    目录Java StringReader流的使用一、StringReader流定义二、StringReader的实例域三、StringReader流构造函数四、StringReader...
    99+
    2022-11-12
  • Java基础知识之StringWriter流的使用
    目录Java StringWriter流的使用一、StringWriter流定义二、StringWriter流实例域三、StringWriter流构造函数四、StringWriter...
    99+
    2022-11-12
  • Java基础知识之CharArrayReader流的使用
    目录Java CharArrayReader流一、CharArrayReader流定义二、CharArrayReader流的构造函数三、CharArrayReader流的实例域四、C...
    99+
    2022-11-12
  • Java基础知识之CharArrayWriter流的使用
    目录Java CharArrayWriter流一、CharArrayWriter流定义二、CharArrayWriter流构造函数三、CharArrayWriter流实例域四、Cha...
    99+
    2022-11-12
  • Java基础知识之ByteArrayInputStream流的使用
    目录Java ByteArrayInputStream流一、ByteArrayInputStream流定义二、ByteArrayInputStream流实例域三、ByteArrayI...
    99+
    2022-11-12
  • Java基础知识之BufferedReader流的使用
    目录一、BufferedReader类概念二、BufferedReader类实例域三、BufferedReader类构造函数四、BufferedReader类API五、Buffere...
    99+
    2022-11-12
  • Java基础入门知识
    以下是学习java必备的知识 目录 前言 一、Java入门 二、基本数据类型与数组 标识符与关键字 2. 基本数据类型 3. 类型转换运算 4. 运算符 5. 数组 6.控制结构(与c使用一致) 总结 ...
    99+
    2023-09-01
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作