当前位置:首页 > Java技术 > 浅析java中的BigDecimal

浅析java中的BigDecimal

2022年09月16日 20:24:39Java技术8
在精确小数运算中,经常会用到java.math.BigDecimal这个类,那么BigDecimal到底能参与多大范围的数字间的运算呢,查看BigDecimal的注释:

浅析java中的BigDecimal _ JavaClub全栈架构师技术笔记

意思就是一个Bigdecimal是任意精度的 整数非标度值和32位标度值组成,那么BigDecimal的最大值,以及最大小数位到底可以是多少呢。通过查看源码可以看到

public class BigDecimal extends Number implements Comparable<BigDecimal> {
     
    /**
     * The unscaled value of this BigDecimal
     */
    private final BigInteger intVal;
    /**
     * The scale of this BigDecimal.
     */
    private final int scale; 
    ...
}

也就是说一个BigDecimal表示的数字实际上是由BigInteger 来表示这个数字的值,int 来表示有多少个小数位,
比如:
intVal = 1000;
scale = 1;

@Test
public void testVal(){
    BigDecimal bigDecimal2 = new BigDecimal(new BigInteger("1000"), 1);
    System.out.println(bigDecimal2);
}

那么这个数字的值实际上是100.0;

所以Bigdecimal能表示的最大整数应该是Biginteger的最大值
最多能有Integer.MAX_VALUE个小数位

另外在利用Bigdecimal做除法时,如果遇到除不尽的情况下,如果不指定精度会抛出异常。

@Rule
public ExpectedException thrown= ExpectedException.none();

@Test
public void testDivide(){
    BigDecimal ten = new BigDecimal("10");
    BigDecimal three = new BigDecimal("3");
    thrown.expect(ArithmeticException.class);
    thrown.expectMessage("Non-terminating decimal expansion; " +
                                             "no exact representable decimal result.");
    System.out.println(ten.divide(three));
}
@Test
public void testDivide2(){
    BigDecimal ten = new BigDecimal("10");
    BigDecimal three = new BigDecimal("3");
    System.out.println(ten.divide(three,10,RoundingMode.HALF_UP)); //保留10位小数进行四舍五入
}

此外在运算上面,Bigdecimal会根据数值大小来决定是否使用long值做计算,如果数值比较大才会使用BigInteger进行计算。

作者:试水流连
来源链接:https://blog.csdn.net/m0_38043362/article/details/78049655

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/42160.html

标签: BigDecimal
分享给朋友:

“浅析java中的BigDecimal” 的相关文章

JDK中BigDecimal的代码实现

package java.math; import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.PrintStream;...

BigDecimal<转载>

前言 我们都知道浮点型变量在进行计算的时候会出现丢失精度的问题。如下一段代码: System.out.println(0.05 + 0.01); System.out.println(1.0 - 0.42); System.out.printl...

BigDecimal在使用中遇到的问题

BigDecimal在使用中遇到的问题

问题出处 今天在做活动统计的时候遇到的问题,数据库使用的字段为字符串来存储金额,解释就是不确定奖励是物品还是金钱,所以使用字符串来存储的,在查询做统计的时候需要对这个字段进行相加操作,本来想了下在mapper里直接使用sql来进行统计,后来测试是行...

BigInteger类,BigDecimal类,超大数字的运算与精度

 BigInteger类   可以让超过Integer范围内的数据进行运算   不可变的任意精度的整数。  java.lang.Object  ——java.lang.Number ——————java.math.Bi...

BigDecimal 判断大于小于

BigDecimal a = new BigDecimal (101); BigDecimal b = new BigDecimal (111);   //使用compareTo方法比较 //注意:a、b均不能为null,否则会报空指针 if(a.compareTo(b...

Collectors扩展接口 实现BigDecimal的相加

Collectors扩展接口 实现BigDecimal的相加 第一步创建 ToBigDecimalFunction接口 import java.math.BigDecimal; @FunctionalInterface public interface ToBigDec...

BigDecimal的各种使用方式

BigDecimal的使用 Bigdecimal在使用的时候不可为空,如果为空的情况建议变成BigDecimal.ZERO,这是本人工作时需要进行搜集 与整理,留作学习记录 //BigDecimal的加减乘除 //加法...

Java精确运算(BigDecimal)

(1)、浮点数精确计算 胜利油田三流合一项目中一直存在一个问题,就是每次报表统计的物资金额和实际的金额要差那么几分钱,和实际金额不一致,让客户觉得总是不那么舒服,原因是因为我们使用java的浮点类型double来定义物资金额,并且在报表统计中我们经常要进行一些运算,但Ja...

Java使用BigDecimal精度丢失问题

Java使用BigDecimal精度丢失问题

在实际应用中,经常会使用到计算,特别是在企业用途上,计算的结果往往要求的更加精确,这是我们就会使用到java.math包中提供的API类BigDecimal,用于对超过16位有效位数的数字进行精确的计算; 下列为使用时出现的问题: // 运行...

了解BigDecimal常用坑,不迷路

背景 一直从事金融相关项目,所以对BigDecimal再熟悉不过了,也曾看到很多同学因为不知道、不了解或使用不当导致资损事件发生。 所以,如果你从事金融相关项目,或者你的项目中涉及到金额的计算,那么你一定要花时间看看这篇文章,全面学习一下BigDe...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。