首页 > 编程知识 正文

java bigdecimal最大值,java.math.BigDecimal

时间:2023-05-03 08:56:18 阅读:248601 作者:3368

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




例子 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]); }}

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

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

字段摘要
构造方法

方法




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。

下面,举个例子说明一下不同舍入模式下的数值计算结果,保留一位小数:

转自: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入

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。