当前位置:首页 > Java技术 > java大数类-----BigDecimal和BigInteger

java大数类-----BigDecimal和BigInteger

2022年09月16日 19:59:56Java技术6

大整数操作—BigInteger类

  • 应用场景
    正常情况下,整数的类型中,能表示的最大整数必然是Long类型,为8个字节,但如果有这么一个数字为132456489745156784165458784156
    因为 long类型 的整数范围是有限的,在 Java中 引入了专门用来进行大数操作的一个类 —— BigInteger类。
  • 方法
    • 构造方法
      java大数类-----BigDecimal和BigInteger _ JavaClub全栈架构师技术笔记
    • 方法

java大数类-----BigDecimal和BigInteger _ JavaClub全栈架构师技术笔记
java大数类-----BigDecimal和BigInteger _ JavaClub全栈架构师技术笔记
java大数类-----BigDecimal和BigInteger _ JavaClub全栈架构师技术笔记
java大数类-----BigDecimal和BigInteger _ JavaClub全栈架构师技术笔记

  • 例子
import java.math.BigInteger;

public class Test {
    public static void main(String[] args) {
        // 用来保存 两个大数
        BigInteger b1 = new BigInteger("987654321098765432109876543210");
        BigInteger b2 = new BigInteger("123456789012345678901234567890");

        // 两个大数的运算(加减乘除、最大值、最小值)
        System.out.println("b1 + b2 = " + b1.add(b2));        // 加
        System.out.println("b1 - b2 = " + b1.subtract(b2));   // 减
        System.out.println("b1 * b2 = " + b1.multiply(b2));   // 乘
        System.out.println("b1 / b2 = " + b1.divide(b2));     // 除
        System.out.println("max: " + b1.max(b2));        // 最大值
        System.out.println("min: " + b1.min(b2));        // 最小值
        System.out.println();

        // 除法操作,数组的第一个元素是除法的商,第二个元素是除法的余数
        BigInteger[] bArr = b1.divideAndRemainder(b2);
        System.out.println("商:" + bArr[0]);
        System.out.println("余数:" + bArr[1]);
    }
}

java大数类-----BigDecimal和BigInteger _ JavaClub全栈架构师技术笔记

大小数操作—-BigDecimal类

  • 应用
    在日常开发中我们经常会碰到小数运算,而小数直接进行运算的话会出现一些,请看下列代码:
System.out.println(2.00 - 1.10);

  如果不看输出结果,我们很有可能会认为输出的是 0.9,可真正输出的却是0.8999999999999999。这是为什么呢?这是因为我们计算机在进行浮点运算时,采用的是二进制运算,这样做非常容易导致精度丢失(如上列代码)。
所以进行小数的精确计算,需要用到BigDecimal类

  • 字段摘要
    java大数类-----BigDecimal和BigInteger _ JavaClub全栈架构师技术笔记
  • 构造方法
    java大数类-----BigDecimal和BigInteger _ JavaClub全栈架构师技术笔记
    java大数类-----BigDecimal和BigInteger _ JavaClub全栈架构师技术笔记
  • 方法
    java大数类-----BigDecimal和BigInteger _ JavaClub全栈架构师技术笔记
    java大数类-----BigDecimal和BigInteger _ JavaClub全栈架构师技术笔记
    java大数类-----BigDecimal和BigInteger _ JavaClub全栈架构师技术笔记
    java大数类-----BigDecimal和BigInteger _ JavaClub全栈架构师技术笔记
    java大数类-----BigDecimal和BigInteger _ JavaClub全栈架构师技术笔记

BigDecimal舍入模式

尽管数据库存储的是一个高精度的浮点数,但是通常在应用中展示的时候往往需要限制一下小数点的位数,比如两到三位小数即可,这时就需要使用到setScale(int newScale, int roundingMode)函数,作为BigDecimal的公有静态变量,舍入模式(Rounding Mode)的运算规则比较多,公有八种,这里作个说明,官方文档也有介绍。

ROUND_UP
向远离零的方向舍入。舍弃非零部分,并将非零舍弃部分相邻的一位数字加一。

ROUND_DOWN
向接近零的方向舍入。舍弃非零部分,同时不会非零舍弃部分相邻的一位数字加一,采取截取行为。

ROUND_CEILING
向正无穷的方向舍入。如果为正数,舍入结果同ROUND_UP一致;如果为负数,舍入结果同ROUND_DOWN一致。注意:此模式不会减少数值大小。

ROUND_FLOOR
向负无穷的方向舍入。如果为正数,舍入结果同ROUND_DOWN一致;如果为负数,舍入结果同ROUND_UP一致。注意:此模式不会增加数值大小。

ROUND_HALF_UP
向“最接近”的数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。如果舍弃部分>= 0.5,则舍入行为与ROUND_UP相同;否则舍入行为与ROUND_DOWN相同。这种模式也就是我们常说的我们的“四舍五入”。

ROUND_HALF_DOWN
向“最接近”的数字舍入,如果与两个相邻数字的距离相等,则为向下舍入的舍入模式。如果舍弃部分> 0.5,则舍入行为与ROUND_UP相同;否则舍入行为与ROUND_DOWN相同。这种模式也就是我们常说的我们的“五舍六入”。

ROUND_HALF_EVEN
向“最接近”的数字舍入,如果与两个相邻数字的距离相等,则相邻的偶数舍入。如果舍弃部分左边的数字奇数,则舍入行为与 ROUND_HALF_UP 相同;如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。注意:在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况,如果前一位为奇数,则入位,否则舍去。

ROUND_UNNECESSARY
断言请求的操作具有精确的结果,因此不需要舍入。如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。

下面,举个例子说明一下不同舍入模式下的数值计算结果,保留一位小数:
java大数类-----BigDecimal和BigInteger _ JavaClub全栈架构师技术笔记
转自:https://www.jianshu.com/p/87627d53f77b

  • 舍入模式的设置
    BigDecimal的setScale方法

BigDecimal.setScale()

方法用于格式化小数点

表示保留一位小数,默认用四舍五入方式

setScale(1)

直接删除多余的小数位,如2.35会变成2.3 setScale(1,BigDecimal.ROUND_DOWN)

进位处理,2.35变成2.4 setScale(1,BigDecimal.ROUND_UP)

四舍五入,2.35变成2.4 setScale(1,BigDecimal.ROUND_HALF_UP)

四舍五入,2.35变成2.3,如果是5则向下舍setScaler(1,BigDecimal.ROUND_HALF_DOWN)

更多模式请查询API

注意点一

scale指的是你小数点后的位数。 scale()就是BigDecimal类中的方法。如 BigDecimal b = new BigDecimal(“123.456”); b.scale()返回的就是3

注意点二

roundingMode是小数的保留模式。它们都是BigDecimal中的常量字段, 有很多种,如 BigDecimal.ROUND_HALF_UP表示的就是4舍5入

作者:o﹎んèιιò_còdè┌↘
来源链接:https://blog.csdn.net/qq_40893056/article/details/82686266

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

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


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

标签: BigDecimal
分享给朋友:

“java大数类-----BigDecimal和BigInteger” 的相关文章

java中的BigDecimal和String的相互转换

转自:http://blog.163.com/linshengru@126/blog/static/98663794201010268532565/ /*由数字字符串构造BigDecimal的方法 *设置BigDecimal的小数位数的方法 */ imp...

java.math.BigDecimal常用方法

+构造函数 BigDecimal(BigInteger val) 将BigInteger转化为BigDecimal。 BigDecimal(BigInteger unscaledVal, int scale) 将B...

BigDecimal 与 doubleValue 的使用 ,以及四舍五入

/** * 保存发票信息 * @param controller * @return * @throws ParseException * @throws ActiveRecordException */ @...

JDK中BigDecimal的代码实现

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

BigInteger、BigDecimal、数字格式化

BigInteger与BigDecimal的目的是用来精确地表示大整数和小数,常用于商业计算中。 BigInteger:支持任意精度的整数,可以精确地表示任意大小的整数值,同时在运算过程中不会丢失任何信息。 BigDecimal:可以精确地表示任意精度的小数,同时在运算过程...

BigDecimal转换

BigDecimal转换

文章目录 new一个BigDecimal add():相当于加 sub():相当于减 multiply():相当于乘 divide()相当于除 java...

关于BigDecimal与Double

关于BigDecimal与Double

BigDecimal与double 前几天,系统处理double类型的加减法,出现问题。 请看题: 示例1 问, 结果是多少? 0.01? No! 结果是0.00999999999999999...

BigDecimal学习笔记

BigDecimal的运算 BigDecimal的运算——加减乘除 一、函数使用 1、尽量用字符串的形式初始化 BigDecimal num12 = new BigDecimal("0.005"); BigDecimal num22...

关于BigDecimal

1.int 转化成BigDecimal 类型      int num=88.4;      BigDecimal test = new BigDecimal(num); 2. BigDeci...

BigDecimal的用法总结

BigDecimal的使用整理 BigDecimal与int,long类型的互转 四则运算 BigDecimal与int,long类型的...

发表评论

访客

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