Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >财务精度:BigInteger 与 BigDecimal

财务精度:BigInteger 与 BigDecimal

原创
作者头像
RainbowSea
发布于 2023-01-23 03:46:42
发布于 2023-01-23 03:46:42
86900
代码可运行
举报
运行总次数:0
代码可运行

财务精度:BigInteger 与 BigDecimal


每博一文案

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
师父说: 人这一辈子,真地好难。
有些人,好着好着,忽然就变陌生了,有些手,牵着牵着,瞬间就放开了,有些路,走着走着,就失去了方向了。
懵懵懂懂,一眨眼,我们就长大了,爱过的人,一转身,,青春就溜走了。以为有来日方长的,最后只剩人走茶凉。
以为能护你周全的,把你留给大风大浪。时光会老,爱会退潮,猜不透的,是人心,回不去,是从前。
从早晨到天黑,忙忙碌碌就是一天,从年初道年尾,辛辛苦苦就是一年。
为了家人,再苦也要咬牙奋斗,为了生活,再累也要微笑面对。
道不尽的,是付出,丢不掉的,是责任。人累了就休息,没有铁打的身体,心累了就放下,不是你的留不住。
一生很短,不要追得太多,心也有限,不必装太满。家不求奢华,只愿温馨和睦,
爱不求浪漫,只愿一生相伴。凡事看开了,烦恼就少了,人心看淡了,受伤就少了,
感情,大不了就是一聚一散,生活,大不了就是一起一落,相爱,有苦有甜才叫日子,心情,有起有落才叫人生。
愿你想开了就不必困惑,参透了就不用执着。
                                            ——————   一禅心灵庙语

1. BigInteger

Integer 类作为 int 的包装类,能存储的最大整型值为 2^31-1,Long 类也是有限的,最大为 2^63-1。如果要表示再大的整数,不管是基本数据类型还是他们的包装类都无能为力,更不用说进行运算了。

java.math 包的 BigInteger 可以表示不可变的任意精度的整数。BigInteger 提供所有 java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。另外,BigInteger 还提供以下运算:模算术,GCD 计算,质数测试,素数生成,位操作以及一些其他操作。


一般使用 public BigInteger(String val) 构造器创建 Bigteger 对象


代码语言:java
AI代码解释
复制
import java.math.BigInteger;

public class BigIntegerTest {
    public static void main(String[] args) {
        BigInteger bigInteger = new BigInteger("9999999999");
        System.out.println(bigInteger);

    }
}


1.2 BigInteger 常用的方法

1.2.1  BigInteger 的 ”+“ add(), "-"subtract,"*" multiply,"/" divide

BigInteger  是引用数据类型,不是基本数据类型,是不可以直接使用 "+.-.*./" 这些算术运算符的,而是通过调用其对应的对象方法才行。

  • +   加 public BigInteger add(BigInteger val)
  • - 减 public BigInteger subtract(BigInteger val)
  • * 乘 public BigInteger multiply(BigInteger val)
  • / 除public BigInteger divide(BigInteger val)
  • 注意所传的参数 BigInteger 类型的才行的,以及是加减乘除后,返回一个新的 BigInteger 对象不是,在原本的基础上修改的
  • BigInteger 继承了 Number 类,其 Integer 也是继承了该 Number 类。

举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.math.BigInteger;

public class BigIntegerTest {
    public static void main(String[] args) {
        BigInteger bigInteger = new BigInteger("9999999999");
        BigInteger bigInteger2 = new BigInteger("1");

        BigInteger add = bigInteger.add(bigInteger2);              // +
        System.out.println(add);

        BigInteger subtract = bigInteger.subtract(bigInteger2);    // -
        System.out.println(subtract);

        BigInteger multiply = bigInteger.multiply(bigInteger2);    // *
        System.out.println(multiply);

        BigInteger divide = bigInteger.divide(bigInteger2);        // /
        System.out.println(divide);

    }
}
1.2.2 绝对值:abs()  ,取模:remainder() ,次方:pow()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public BigInteger abs(); // 返回其绝对值。
public BigInteger remainder(BigInteger val); // 返回其值为 (this % val) 的 BigInteger。 
public BigInteger pow(int exponent);  // 返回其值为 (thisexponent) 的 BigInteger。注意,exponent 是一个整数而不是 BigInteger。

同样的是运算后返回一个新的 BigInteger对象,不是在原来的基础上修改的

举例

代码语言:java
AI代码解释
复制
import java.math.BigInteger;

public class BigIntegerTest {
    public static void main(String[] args) {
        BigInteger bigInteger = new BigInteger("-3");
        BigInteger abs = bigInteger.abs();          // 绝对值
        System.out.println(abs);

        BigInteger bigInteger2 = new BigInteger("2");

        BigInteger remainder = bigInteger.remainder(bigInteger2);   // 取模 %
        System.out.println(remainder);

        BigInteger pow = bigInteger.pow(2);    // 次方
        System.out.println(pow);
    }
}

2. BigDecimal

一般的 Float 类 和 Double 类可以用来左科学计算或工程计算,但在商业,财务,金融 计算中,要求的数字精度比较高,故用

java.math.BigDecimal 类。

因为 无论是 Float 类 还是 Dobule 类都存在精度问题。具体原因大家可以移步至: 浮点数的精确度的探究_ChinaRainbowSea的博客-CSDN博客

你真的了解C语言 if - else 、bool(布尔值)、浮点数损失吗 ?_c11中有bool_ChinaRainbowSea的博客-CSDN博客

如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class BigDoubleTest {
    public static void main(String[] args) {
        double num = 2.9999999999999999999998;
        System.out.println(num);
    }
}

BigDecimal类解决了这个,精度上的问题,并支持不可变的、任意精度的有符号十进制定点数。

常用的构造器两个

代码语言:java
AI代码解释
复制
public BigDecimal(double val);  // 将 double 转换为 BigDecimal,后者是 double 的二进制浮点值准确的十进制表示形式。
public BigDecimal(String val);  // 将 BigDecimal 的字符串表示形式转换为 BigDecimal

举例:

代码语言:java
AI代码解释
复制
import java.math.BigDecimal;

public class BigDoubleTest {
    public static void main(String[] args) {
        double num = 2.9999999999999999999998;
        System.out.println(num);   // 精度问题;

        BigDecimal bigDecimal2 = new BigDecimal("2.9999999999999999999998");
        System.out.println(bigDecimal2);
        
    }
}

2. 1 BigDecimal 常用的方法

2.1.1  BigDecimal 的 ”+“ add(), "-"subtract,"*" multiply,"/" divide
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public BigDecimal add(BigDecimal augend);  // 返回一个 BigDecimal,其值为 (this + augend),其标度为 max(this.scale(), augend.scale())。 
public BigDecimal divide(BigDecimal divisor,int scale,RoundingMode roundingMode) // 返回一个 BigDecimal,其值为 (this / divisor),其标度为指定标度。如果必须执行舍入,以生成具有指定标度的结果,则应用指定的舍入模式。 
参数:
divisor - 此 BigDecimal 要除以的值。
scale - 要返回的 BigDecimal 商的标度。
roundingMode - 要应用的舍入模式。 
    
public BigDecimal multiply(BigDecimal multiplicand);  // 返回一个 BigDecimal,其值为 (this × multiplicand),其标度为 (this.scale() + multiplicand.scale())。 

public BigDecimal subtract(BigDecimal subtrahend);  // 返回一个 BigDecimal,其值为 (this - subtrahend),其标度为 max(this.scale(), subtrahend.scale())。

注意:  是不可变的,都是计算后返回一个新的BigDecimal 对象,不是在原来的基础上修改的。

举例;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.math.BigDecimal;

public class BigDoubleTest {
    public static void main(String[] args) {
        BigDecimal bigDecimal = new BigDecimal("2.9999999999999999999998");
        BigDecimal add = bigDecimal.add(new BigDecimal("1"));   // 加
        System.out.println(add);

        BigDecimal subtract = bigDecimal.subtract(new BigDecimal(1));  // 减
        System.out.println(subtract);

        BigDecimal multiply = bigDecimal.multiply(new BigDecimal(2));   // 乘
        System.out.println(multiply);

        BigDecimal divide = bigDecimal.divide(new BigDecimal(2));   // 除
        System.out.println(divide);

    }
}

这里特别说明一下 BigDecimal 的除法 会 如果除不尽话,可以设置保留精度

如果除数是 0 ,同样是会报算术异常的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public BigDecimal divide(BigDecimal divisor,int scale, int roundingMode)

如下是: roundingMode 舍入的模式:说白了就是:四舍五入时的取舍规则,什么情况取,什么情况舍

举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.math.BigDecimal;

public class BigDoubleTest {
    public static void main(String[] args) {
        BigDecimal bigDecimal = new BigDecimal("2.9999999999999999999998");
        BigDecimal bigDecimal2 = new BigDecimal(2);

        BigDecimal divide = bigDecimal.divide(bigDecimal2,6,BigDecimal.ROUND_FLOOR);   // 除
        System.out.println(divide);
    }
}

3. 总结:

  1. BigDecimal 属于大数据,精度很高,不属于基本数据类型,属于java对象(引用数据类型)这是sun提供的一个类,专门用在财务软件当中。
  2. 注意: 财务软件中的double 是不够的,当处理财务数据时,用那一种类型 ?  千万不能用 double 要用 java.math.BigDecimal 中的类的这个对象
  3. 以及处理 Double 精度上的问题,使用 ``java.math.BigDecimal` 处理。
  4. 对于存储大的 Int 数值 使用 ``java.Math.BigInteger` 类 存储范围更大。
  5. 无论是 : BigDecimal  还是 BigInteger 都是引用类型,不是基本数据类型,对于 ”加减乘除“ 运算符,都不可以直接运算,而是通过 对于的方法进行了。”+“ add(), "-"subtract,"*" multiply,"/" divide。
  6. 无论是 : BigDecimal  还是 BigInteger 都是不可变的,其计算的结果都是,返回一个新的对象,不是在原来的基础上修改的。

4. 最后:

限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,江湖再见,后会有期 !!!


原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java中大数的计算BigInteger和BigDecimal两个类的常用方法
samRsa
2025/02/24
1650
java基础学习_常用类04_正则表达式、Math类、Random类、System类、BigInteger类、BigDecimal类、Date和DateFormat类、Calendar类_day14总
============================================================================= ======================
黑泽君
2019/02/25
6510
java基础学习_常用类04_正则表达式、Math类、Random类、System类、BigInteger类、BigDecimal类、Date和DateFormat类、Calendar类_day14总
第三阶段-Java常见对象:【第十章 BigInteger和BigDecimal类】
将double转换为BigDecimal ,这是double的二进制浮点值的精确十进制表示。
BWH_Steven
2019/08/09
4030
JAVA之学习biginteger类的使用和bigdecimal类的使用
biginteger类的使用 A:BigInteger的概述 * 可以让超过Integer范围内的数据进行运算 * B:构造方法 * public BigInteger(String val) * C:成员方法 * public BigInteger add(BigInteger val) * public BigInteger subtract(BigInteger val) * public BigInteger multiply(BigInteger val) *
吾爱乐享
2018/07/13
7550
java学习之路:24.大数字运算(BigInteger,BigDecimal)
BigInteger类型的数字要比Integer类型的数字范围大得多,并且支持任意精度的整数,在运算中,BigInteger类型可以准确地表示任何大小的整数值而不会丢失任何信息。 该类中除了基本的加减乘除,还提供了绝对值,相反数,最大公约数以及判断是否为质数。 BigInteger类具有很多构造函数,但最直接的一种方式是参数以字符串形式代表要处理的数字。语法如下:
花狗Fdog
2020/10/28
9880
Java基础(十八):java比较器、系统相关类、数学相关类
Java微观世界
2025/01/21
970
Java基础(十八):java比较器、系统相关类、数学相关类
14(02)正则表达式,Pattern,Mactcher,Math,BigInteger,BigDeximal,System等
5:BigInteger(理解) (1)针对大整数的运算 (2)构造方法 A:BigInteger(String s) package cn.itcast_01; import java.math.BigInteger; /* * BigInteger:可以让超过Integer范围内的数据进行运算 * * 构造方法: * BigInteger(String val) */ public class BigIntegerDemo { public static void main(St
Java帮帮
2018/03/16
1K0
下次谁再这么用BigDecimal就直接开除
今日推荐文章:使用云开发平台 0 代码开发一个 AI 智能助手小程序-腾讯云开发者社区-腾讯云
半月无霜
2024/11/21
1540
[十七]基础类型BigDecimal简介
BigDecimal表示的数为: unscaledValue × 10的-scale 次幂
noteless
2018/12/05
2.7K0
[十七]基础类型BigDecimal简介
为什么阿里开发手册建议使用 BigDecimal 来进行浮点数的运算?
大家好,我是 Guide。《阿里巴巴 Java 开发手册》中提到:“为了避免精度丢失,可以使用 BigDecimal来进行浮点数的运算”。
Guide哥
2021/12/15
1.2K0
为什么阿里开发手册建议使用 BigDecimal 来进行浮点数的运算?
备战蓝桥杯——大数处理BigInteger&BigDecimal
Java提供了两个专门的类进行高精度运算:BigInteger与BigDecimal,虽然Java原始变量都具有对应的封装类型,但是这两个变量没有对应的原始类型,而是通过方法来提供这两种类型的一些运算,其含义为普通类型能够做的操作,这两个类型对应都有,只是因为精度过大可能效率不够高。至于这两个类的具体操作可以参考JDK的相关API文档。 关于数据类型的一些技巧:若要求精度的结果,尽量避免使用float和double: float和double类型本身是为了做科学运算,即执行二进制浮点运算而设计,但是却不能提供完全精确的结果,所以在要求精度的数值中,避免使用float和double,float和double在货币运算中尤其不合适,要让float和double精确表达0.1也是不可能的事。测试一下下边这段代码就明白了:
红目香薰
2024/12/11
1710
备战蓝桥杯——大数处理BigInteger&BigDecimal
java高级进阶|不卑不亢,做自己
这次先分析分析BigDecimal的用法,因为之前自己在使用float和double这样的基本数据类型时踩过坑,所以这次写也算是有时间来看下,如何更好的看下BigDecimal的基本用法了,其基本使用还是加减乘除的运算。算是自我的一次总结吧。
码农王同学
2020/06/28
9490
java高级进阶|不卑不亢,做自己
Java--Big Number操作(BigInteger类和BigDecimal类)
java.math.BigInteger 类的使用场景是大整数操作。它提供类似所有Java的基本整数运算符和java.lang.Math中的所有相关的方法的操作,如+、-、*、/、%、&、|、mod、>>、<<,以及min()、max()等等。只不过它操作的整数都是极其大的,为科学计算提供了很大的便利。比如下面的代码就是计算20000000000000000000 * 30000000000000000000,利用BigInteger可以很容易的计算出来结果。
SuperHeroes
2019/03/12
1.1K0
一文带你读懂 BigDecimal 源码
本章带来的是BigDecimal类的源码解读。BigDecimal类是 Java 在 java.math 包中提供的API类,用来对超过16位有效位的数进行精确的运算。除了复杂度设计和拓展性,里面的数学计算思维也很值得我们学习。对于用惯了float/double的同学,得好好仔细看看了。
后台技术汇
2022/05/28
6880
一文带你读懂 BigDecimal 源码
Java中的数学相关类
java.lang.Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。类似这样的工具类,其所有方法均为静态方法,并且不会创建对象。
鱼找水需要时间
2023/04/28
4040
【刨根问底】BigDecimal 案例和部分源码分析
在咱们开发过程中很容易遇到计算的问题,普通计算其实也还好使用int、long、double、float基本上能应付。但是如果涉及到数据类型转后在处理等就不是很好做,于是这会Bigdecimal就出现了。
田维常
2019/07/16
1.2K0
【刨根问底】BigDecimal 案例和部分源码分析
Java-BigDecimal数据类型
我们知道在Java中有float和double类型,它们的主要设计目标是为了科学计算和工程计算。然而,它们没有提供完全精确的结果【因为其有限的有效位数】,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求更加精确的结果,这时候BigDecimal的重要性就不言而喻了!
老九学堂-小师弟
2019/09/20
1K0
丸辣!BigDecimal又踩坑了
小菜之前在国内的一家电商公司自研电商项目,在那个项目中是以人民币的分为最小单位使用Long来进行计算
菜菜的后端私房菜
2024/08/20
4560
【答疑解惑】Java中的高精度数字
前几天网友在群里有问BigDecimal能直接赋值吗?就像使用基本数据类型那样,答案是不能。 Java中的基本数据类型有的时候是不能满足实际编程需要的,特别是在数学、科学、工程、货币等领域,因为精度不够,所以Java提供了java.math.BinInteger类和java.math.BigDecimal类,其中BigInteger类是针对大整数的处理类,而BigDecimal类则是针对大小数的处理类,它们不属于基本数据类型,所以不能按照普通的基本数据类型那样计算,那么它们是怎样进行数据运算的呢?下面以Bi
程序员互动联盟
2018/03/13
9270
BigDecimal加减乘除计算
前阵子做题遇到了大数的精确计算,再次认识了bigdecimal 关于Bigdecimal意外的有许多小知识点和坑,这里特此整理一下为方便以后学习,希望能帮助到其他的萌新
全栈程序员站长
2022/07/23
2.4K0
BigDecimal加减乘除计算
推荐阅读
相关推荐
java中大数的计算BigInteger和BigDecimal两个类的常用方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验