Java 数学计算(一):BigDecimal 详解 + 代码示例

这篇具有很好参考价值的文章主要介绍了Java 数学计算(一):BigDecimal 详解 + 代码示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java 数学计算(一):BigDecimal 详解 + 代码示例

❤️ 个人主页:水滴技术
🌸 订阅专栏:Java 教程:从入门到精通
🚀 支持水滴:点赞👍 + 收藏⭐ + 留言💬


大家好,我是水滴~~

本文主要对 BigDecimal 类进行详细介绍,主要内容有:构造器、静态方法、静态常量、常用方法、舍入模式,并提供了大量的代码示例,可以将该文章当成工具书来用。

一、构造器

通过构造器获取 BigDecimal 的实例, 传入值共分为四大类:字符数组、字符串、数字、BigInteger 对象。

1.1 传入字符数组

通过传入字符数组的构造器有四个,要求所有字符都是数字:

  • BigDecimal(char[] in):传入字符数组
  • BigDecimal(char[] in, int offset, int len):传入字符数组、偏移量、长度
  • BigDecimal(char[] in, MathContext mc):传入字符数组,并指定精度和舍入模式
  • BigDecimal(char[] in, int offset, int len, MathContext mc):传入字符数组、偏移量、长度,并指定精度和舍入模式

代码示例:

// 字符数组
char[] in = "123.456".toCharArray();

// 传入字符数组
BigDecimal bd1 = new BigDecimal(in);
System.out.println("bd1 --> " + bd1);

// 传入字符数组、偏移量、长度
BigDecimal bd2 = new BigDecimal(in, 2, 4);
System.out.println("bd2 --> " + bd2);

// 传入字符数组,并指定精度和舍入模式
BigDecimal bd3 = new BigDecimal(in, new MathContext(5, RoundingMode.HALF_UP));
System.out.println("bd3 --> " + bd3);

// 传入字符数组、偏移量、长度,并指定精度和舍入模式
BigDecimal bd4 = new BigDecimal(in, 2, 4, new MathContext(2, RoundingMode.HALF_UP));
System.out.println("bd4 --> " + bd4);

输出结果:

bd1 --> 123.456
bd2 --> 3.45
bd3 --> 123.46
bd4 --> 3.5

1.2 传入字符串

通过传入字符串的构造器有两个,要求字符串是个数字:

  • BigDecimal(String val):传入字符串
  • BigDecimal(String val, MathContext mc):传入字符串,并指定精度和舍入模式

代码示例:

// 字符串
String val = "123.456";

// 传入字符串
BigDecimal bd1 = new BigDecimal(val);
System.out.println("bd1 --> " + bd1);

// 传入字符串,并指定精度和舍入模式
BigDecimal bd2 = new BigDecimal(val, new MathContext(5, RoundingMode.HALF_UP));
System.out.println("bd2 --> " + bd2);

输出结果:

bd1 --> 123.456
bd2 --> 123.46

1.3 传入数字

通过传入数字类型的构造器有六个,其中 int、long、double 各两个:

  • BigDecimal(int val):传入 int 类型
  • BigDecimal(int val, MathContext mc):传入 int 类型,并指定精度和舍入模式
  • BigDecimal(long val):传入 long 类型
  • BigDecimal(long val, MathContext mc):传入 long 类型,并指定精度和舍入模式
  • BigDecimal(double val):传入 double 类型(存在精度问题,不推荐使用)
  • BigDecimal(double val, MathContext mc):传入 double 类型,并指定精度和舍入模式(存在精度问题,不推荐使用)

代码示例:

// 传入 int 类型
BigDecimal bd1 = new BigDecimal(123456);
System.out.println("bd1 --> " + bd1);

// 传入 int 类型,并指定精度和舍入模式
BigDecimal bd2 = new BigDecimal(123456, new MathContext(5));
System.out.println("bd2 --> " + bd2);

// 传入 long 类型
BigDecimal bd3 = new BigDecimal(123456L);
System.out.println("bd3 --> " + bd3);

// 传入 long 类型,并指定精度和舍入模式
BigDecimal bd4 = new BigDecimal(123456L, new MathContext(5));
System.out.println("bd4 --> " + bd4);

// 传入 double 类型(存在精度问题,不推荐使用)
BigDecimal bd5 = new BigDecimal(123.456);
System.out.println("bd5 --> " + bd5);

// 传入 double 类型,并指定精度和舍入模式(存在精度问题,不推荐使用)
BigDecimal bd6 = new BigDecimal(123.456, new MathContext(5));
System.out.println("bd6 --> " + bd6);

输出结果:

bd1 --> 123456
bd2 --> 1.2346E+5
bd3 --> 123456
bd4 --> 1.2346E+5
bd5 --> 123.4560000000000030695446184836328029632568359375
bd6 --> 123.46

1.4 传入 BigInteger 对象

通过传入 BigInteger 对象的构造器有四个:

  • BigDecimal(BigInteger val):传入 BigInteger 对象
  • BigDecimal(BigInteger val, MathContext mc):传入 BigInteger 对象,并指定精度和舍入模式
  • BigDecimal(BigInteger unscaledVal, int scale):传入 BigInteger 对象,并进入缩放
  • BigDecimal(BigInteger unscaledVal, int scale, MathContext mc):传入 BigInteger 对象,并进入缩放,并指定精度和舍入模式

代码示例:

// BigInteger 对象
BigInteger val = BigInteger.valueOf(123456);

// 传入 BigInteger 对象
BigDecimal bd1 = new BigDecimal(val);
System.out.println("bd1 --> " + bd1);

// 传入 BigInteger 对象,并指定精度和舍入模式
BigDecimal bd2 = new BigDecimal(val, new MathContext(5));
System.out.println("bd2 --> " + bd2);

// 传入 BigInteger 对象,并进行缩放
BigDecimal bd3 = new BigDecimal(val, 3);
System.out.println("bd3 --> " + bd3);

// 传入 BigInteger 对象,并进行缩放,并指定精度和舍入模式
BigDecimal bd4 = new BigDecimal(val, 3, new MathContext(5));
System.out.println("bd4 --> " + bd4);

输出结果:

bd1 --> 123456
bd2 --> 1.2346E+5
bd3 --> 123.456
bd4 --> 123.46

二、静态方法

BigDecimal 提供了三个静态方法 valueOf(),传入数字即可获取 BigDecimal 实例:

  • BigDecimal valueOf(long val):静态方法,传入 long 类型
  • BigDecimal valueOf(long unscaledVal, int scale):静态方法,传入 long 类型,并且进行缩放
  • BigDecimal valueOf(double val):静态方法,传入 double 类型(会将传入值转为字符串,没有精度问题)

代码示例:

// 静态方法,传入 long 类型
BigDecimal bd1 = BigDecimal.valueOf(123456);
System.out.println("bd1 --> " + bd1);

// 静态方法,传入 long 类型,并且进行缩放
BigDecimal bd2 = BigDecimal.valueOf(123456, 3);
System.out.println("bd2 --> " + bd2);

// 静态方法,传入 double 类型(会将传入值转为字符串,没有精度问题)
BigDecimal bd3 = BigDecimal.valueOf(123.456);
System.out.println("bd3 --> " + bd3);

输出结果:

bd1 --> 123456
bd2 --> 123.456
bd3 --> 123.456

三、静态常量

BigDecimal 提供了三个静态常量,用于获取“零”的实例、“一”的实例、“十”的实例:

  • BigDecimal.ZERO:“零”的静态常量
  • BigDecimal.ONE:“一”的静态常量
  • BigDecimal.TEN:“十”的静态常量

代码示例:

// “零”的静态常量
BigDecimal bd1 = BigDecimal.ZERO;
System.out.println("bd1 --> " + bd1);

// “一”的静态常量
BigDecimal bd2 = BigDecimal.ONE;
System.out.println("bd2 --> " + bd2);

// “十”的静态常量
BigDecimal bd3 = BigDecimal.TEN;
System.out.println("bd3 --> " + bd3);

输出结果:

bd1 --> 0
bd2 --> 1
bd3 --> 10

四、常用方法

4.1 加法(add)

加法运算是由两个 BigDecimal 对象进行相加,返回结果也是一个 BigDecimal 对象。加法运算共有两个重载方法可使用:

  • BigDecimal add(BigDecimal augend):加法运算
  • BigDecimal add(BigDecimal augend, MathContext mc):加法运算,并指定精度和舍入模式

代码示例:

// 构造两个 BigDecimal 对象
BigDecimal val1 = new BigDecimal("56.78");
BigDecimal val2 = new BigDecimal("12.34");

// 加法运算
BigDecimal bd1 = val1.add(val2);
System.out.println(val1 + " + " + val2 + " = " + bd1);

// 加法运算,,并指定精度和舍入模式
BigDecimal bd2 = val1.add(val2, new MathContext(3, RoundingMode.HALF_UP));
System.out.println(val1 + " + " + val2 + " = " + bd2);

输出结果:

56.78 + 12.34 = 69.12
56.78 + 12.34 = 69.1

4.2 减法(subtract)

减法运算是由两个 BigDecimal 对象进行相减,返回结果也是一个 BigDecimal 对象。减法运算共有两个重载方法可使用:

  • BigDecimal subtract(BigDecimal subtrahend):减法运算
  • BigDecimal subtract(BigDecimal subtrahend, MathContext mc):减法运算,并指定精度和舍入模式

代码示例:

// 构造两个 BigDecimal 对象
BigDecimal val1 = new BigDecimal("56.78");
BigDecimal val2 = new BigDecimal("12.34");

// 减法运算
BigDecimal bd1 = val1.subtract(val2);
System.out.println(val1 + " - " + val2 + " = " + bd1);

// 减法运算,,并指定精度和舍入模式
BigDecimal bd2 = val1.subtract(val2, new MathContext(3, RoundingMode.HALF_UP));
System.out.println(val1 + " - " + val2 + " = " + bd2);

输出结果:

56.78 - 12.34 = 44.44
56.78 - 12.34 = 44.4

4.3 乘法(multiply)

乘法运算是由两个 BigDecimal 对象进行相乘,返回结果也是一个 BigDecimal 对象。乘法运算共有两个重载方法可使用:

  • BigDecimal multiply(BigDecimal multiplicand):乘法运算
  • BigDecimal multiply(BigDecimal multiplicand, MathContext mc):乘法运算,并指定精度和舍入模式

代码示例:

// 构造两个 BigDecimal 对象
BigDecimal val1 = new BigDecimal("56.78");
BigDecimal val2 = new BigDecimal("12.34");

// 乘法运算
BigDecimal bd1 = val1.multiply(val2);
System.out.println(val1 + " * " + val2 + " = " + bd1);

// 乘法运算,并指定精度和舍入模式
BigDecimal bd2 = val1.multiply(val2, new MathContext(4, RoundingMode.HALF_UP));
System.out.println(val1 + " * " + val2 + " = " + bd2);

输出结果:

56.78 * 12.34 = 700.6652
56.78 * 12.34 = 700.7

4.4 除法(divide)

除法运算是由两个 BigDecimal 对象进行相除,返回结果也是一个 BigDecimal 对象。除法相对比较特殊,由于可能存在除不尽的情况,有些方法会抛出 ArithmeticException 异常,这个在介绍具体方法时会指明。

除法运算共有六个重载方法,其中两个方法在 Java 9 的时候被废弃,我们这里只介绍剩余四个:

  • BigDecimal divide(BigDecimal divisor):除法运算(未处理除不尽的情况,会报 ArithmeticException 异常,不推荐使用)
  • BigDecimal divide(BigDecimal divisor, MathContext mc):除法运算,并指定精度和舍入模式
  • BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode):除法运算,并指定舍入模式
  • BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode):除法运算,并指定保留的小数位数和舍入模式

代码示例:

// 构造三个 BigDecimal 对象
BigDecimal val1 = new BigDecimal("12.34");
BigDecimal val2 = new BigDecimal("2");
BigDecimal val3 = new BigDecimal("3");

// 除法运算(未处理除不尽的情况,会报 ArithmeticException 异常,不推荐使用)
BigDecimal bd1 = val1.divide(val2);
System.out.println(val1 + " / " + val2 + " = " + bd1);

// 除法运算,并指定精度和舍入模式
BigDecimal bd2 = val1.divide(val3, new MathContext(4, RoundingMode.HALF_UP));
System.out.println(val1 + " / " + val3 + " = " + bd2);

// 除法运算,并指定舍入模式
BigDecimal bd3 = val1.divide(val3, RoundingMode.HALF_UP);
System.out.println(val1 + " / " + val3 + " = " + bd3);

// 除法运算,并指定保留的小数位数和舍入模式
BigDecimal bd4 = val1.divide(val3, 4, RoundingMode.HALF_UP);
System.out.println(val1 + " / " + val3 + " = " + bd4);

输出结果:

12.34 / 2 = 6.17
12.34 / 3 = 4.113
12.34 / 3 = 4.11
12.34 / 3 = 4.1133

4.5 商的整数和余数

4.5.1 取整

divideToIntegralValue 方法是将两个 BigDecimal 对象相除后,获取整数部分,其共有两个重载方法:

  • BigDecimal divideToIntegralValue(BigDecimal divisor):取整
  • BigDecimal divideToIntegralValue(BigDecimal divisor, MathContext mc):取整,并指定精度(精度不够会抛出 ArithmeticException 异常)

代码示例:

// 构造两个 BigDecimal 对象
BigDecimal val1 = new BigDecimal("1234.5678");
BigDecimal val2 = new BigDecimal("3");

// 取整
BigDecimal bd1 = val1.divideToIntegralValue(val2);
System.out.println("[" + val1 + " / " + val2 + "] = " + bd1);

// 取整,并指定精度
BigDecimal bd2 = val1.divideToIntegralValue(val2, new MathContext(4));
System.out.println("[" + val1 + " / " + val2 + "] = " + bd2);

输出结果:

[1234.5678 / 3] = 411.0000
[1234.5678 / 3] = 411.0

4.5.2 取余

remainder 方法是将两个 BigDecimal 对象相除后,取其余数,其共有两个重载方法:

  • BigDecimal remainder(BigDecimal divisor):取余
  • BigDecimal remainder(BigDecimal divisor, MathContext mc):取余,并指定精度(精度不够会抛出 ArithmeticException 异常)

代码示例:

// 构造两个 BigDecimal 对象
BigDecimal val1 = new BigDecimal("1234.5678");
BigDecimal val2 = new BigDecimal("3");

// 取余
BigDecimal bd1 = val1.remainder(val2);
System.out.println(val1 + " % " + val2 + " = " + bd1);

// 取余,并指定精度
BigDecimal bd2 = val1.remainder(val2, new MathContext(3));
System.out.println(val1 + " % " + val2 + " = " + bd2);

输出结果:

1234.5678 % 3 = 1.5678
1234.5678 % 3 = 1.5678

4.5.3 同时取整和取余

divideAndRemainder 方法可以同时取两个 BigDecimal 对象相除后的整数部分和余数。如果同时需要整商和余数,这种方法比分开使用取整和取余的方法更快,因为除尘只需要执行一次。

其共有两个重载方法:

代码示例:

// 构造两个 BigDecimal 对象
BigDecimal val1 = new BigDecimal("1234.5678");
BigDecimal val2 = new BigDecimal("3");

// 同时取商的整数和余数
BigDecimal[] bd1 = val1.divideAndRemainder(val2);
System.out.println("[" + val1 + " / " + val2 + "] = " + bd1[0]);
System.out.println(" " + val1 + " % " + val2 + "  = " + bd1[1]);

// 同时取商的整数和余数,并指定精度
BigDecimal[] bd2 = val1.divideAndRemainder(val2, new MathContext(3));
System.out.println("[" + val1 + " / " + val2 + "] = " + bd2[0]);
System.out.println(" " + val1 + " % " + val2 + "  = " + bd2[1]);

输出结果:

[1234.5678 / 3] = 411.0000
 1234.5678 % 3  = 1.5678
[1234.5678 / 3] = 411.000
 1234.5678 % 3  = 1.5678

4.6 幂运算

通过 pow 方法可以做幂运算。

代码示例:

// 构造 BigDecimal 对象
BigDecimal val = new BigDecimal("2");

// 幂运算
BigDecimal bd1 = val.pow(10);
System.out.println("bd1 --> " + bd1);

// 幂运算,并指定精度
BigDecimal bd2 = val.pow(10, new MathContext(4));
System.out.println("bd2 --> " + bd2);

输出结果:

bd1 --> 1024
bd2 --> 1024

4.7 绝对值

通过 abs 方法获取绝对值。

代码示例:

// 构造 BigDecimal 对象
BigDecimal val = new BigDecimal("-1024");

// 取绝对值
BigDecimal bd1 = val.abs();
System.out.println("bd1 --> " + bd1);

// 取绝对值,并指定精度
BigDecimal bd2 = val.abs(new MathContext(4));
System.out.println("bd2 --> " + bd2);

输出结果:

bd1 --> 1024
bd2 --> 1024

4.8 取反(负号)

通过 negate 方法可以对数进行取反,相当于 -this

代码示例:

// 构造 BigDecimal 对象
BigDecimal val = new BigDecimal("1024");

// 取反
BigDecimal bd1 = val.negate();
System.out.println("bd1 --> " + bd1);

// 取反,并指定精度
BigDecimal bd2 = val.negate(new MathContext(4));
System.out.println("bd2 --> " + bd2);

输出结果:

bd1 --> -1024
bd2 --> -1024

4.9 正号

通过 plus 做正号处理,等于本身,相当于 +this

代码示例:

// 构造 BigDecimal 对象
BigDecimal val = new BigDecimal("-1024");

// 取正
BigDecimal bd1 = val.plus();
System.out.println("bd1 --> " + bd1);

// 取正,并指定精度
BigDecimal bd2 = val.plus(new MathContext(4));
System.out.println("bd2 --> " + bd2);

输出结果:

bd1 --> -1024
bd2 --> -1024

4.10 符号

通过 signum 获取该数的符号:正数为 1;零为 0;负数为 -1

代码示例:

// 构造 BigDecimal 对象
BigDecimal val1 = new BigDecimal("10");
BigDecimal val2 = new BigDecimal("0");
BigDecimal val3 = new BigDecimal("-11");

// 符号函数,获取该数的正负号
System.out.println("bd1 --> " + val1.signum());
System.out.println("bd2 --> " + val2.signum());
System.out.println("bd3 --> " + val3.signum());

输出结果:

bd1 --> 1
bd2 --> 0
bd3 --> -1

4.11 移位

可以对数值进行小数点移位,左移位使用 movePointLeft 方法,右移位使用 movePointRight 方法。

代码示例:

// 构造 BigDecimal 对象
BigDecimal val = new BigDecimal("1234.5678");

// 小数点左移位
BigDecimal bd1 = val.movePointLeft(2);
System.out.println("bd1 --> " + bd1);

// 小数点右移位
BigDecimal bd2 = val.movePointRight(2);
System.out.println("bd2 --> " + bd2);

输出结果:

bd1 --> 12.345678
bd2 --> 123456.78

4.12 最大值和最小值

可以获取两个数的最大值和最小值,最大值使用 max 方法,最小值使用 min 方法。

代码示例:

// 构造 BigDecimal 对象
BigDecimal val1 = new BigDecimal("1024");
BigDecimal val2 = new BigDecimal("2048");

// 取最小值
BigDecimal bd1 = val1.min(val2);
System.out.println("min --> " + bd1);

// 取最大值
BigDecimal bd2 = val1.max(val2);
System.out.println("max --> " + bd2);

输出结果:

min --> 1024
max --> 2048

4.13 转换方法

  • long longValue():转换为 long
  • int intValue():转换为 int
  • float floatValue():转换为 float
  • double doubleValue():转换为 double
  • BigInteger toBigInteger():转换为 BigInteger对象
  • toString:转为 String 字符串,有必要时使用科学计数法
  • toEngineeringString:转为 String 字符串,有必要时使用工程计数法
  • toPlainString:转为 String 字符串,不使用任何计数法

五、舍入模式

BigDecimal 可以通过 setScale()round() 方法来单独设置精度和舍入模式,不同的舍入模式返回的结果也会不同。我们在制定算法时,要先确定舍入模式。

舍入模式共有八种,可以从 RoundingMode 中查看,内容如下:

5.1 UP

从零舍入。只要检测到“废弃数”为非零,就往前入一。

代码示例:

// 构造 BigDecimal 对象
BigDecimal val1 = new BigDecimal("1.6");
BigDecimal val2 = new BigDecimal("1.5");
BigDecimal val3 = new BigDecimal("1.4");
BigDecimal val4 = new BigDecimal("1.1");
BigDecimal val5 = new BigDecimal("1.0");
BigDecimal val6 = new BigDecimal("-1.0");
BigDecimal val7 = new BigDecimal("-1.4");
BigDecimal val8 = new BigDecimal("-1.5");
BigDecimal val9 = new BigDecimal("-1.6");

// 设置精度和舍入模式
System.out.println(val1 + "\t\t\t" + val1.setScale(0, RoundingMode.UP));
System.out.println(val2 + "\t\t\t" + val2.setScale(0, RoundingMode.UP));
System.out.println(val3 + "\t\t\t" + val3.setScale(0, RoundingMode.UP));
System.out.println(val4 + "\t\t\t" + val4.setScale(0, RoundingMode.UP));
System.out.println(val5 + "\t\t\t" + val5.setScale(0, RoundingMode.UP));
System.out.println(val6 + "\t\t"   + val6.setScale(0, RoundingMode.UP));
System.out.println(val7 + "\t\t"   + val7.setScale(0, RoundingMode.UP));
System.out.println(val8 + "\t\t"   + val8.setScale(0, RoundingMode.UP));
System.out.println(val9 + "\t\t"   + val9.setScale(0, RoundingMode.UP));

输出结果:

1.9      2
1.5      2
1.4      2
1.1      2
1.0      1
-1.0    -1
-1.4    -2
-1.5    -2
-1.9    -2

5.2 DOWN

舍入到零。永远舍掉“废弃数”,相当于截断。

代码示例:

// 构造 BigDecimal 对象
BigDecimal val1 = new BigDecimal("1.6");
BigDecimal val2 = new BigDecimal("1.5");
BigDecimal val3 = new BigDecimal("1.4");
BigDecimal val4 = new BigDecimal("1.1");
BigDecimal val5 = new BigDecimal("1.0");
BigDecimal val6 = new BigDecimal("-1.0");
BigDecimal val7 = new BigDecimal("-1.4");
BigDecimal val8 = new BigDecimal("-1.5");
BigDecimal val9 = new BigDecimal("-1.6");

// 设置精度和舍入模式
System.out.println(val1 + "\t\t\t" + val1.setScale(0, RoundingMode.DOWN));
System.out.println(val2 + "\t\t\t" + val2.setScale(0, RoundingMode.DOWN));
System.out.println(val3 + "\t\t\t" + val3.setScale(0, RoundingMode.DOWN));
System.out.println(val4 + "\t\t\t" + val4.setScale(0, RoundingMode.DOWN));
System.out.println(val5 + "\t\t\t" + val5.setScale(0, RoundingMode.DOWN));
System.out.println(val6 + "\t\t"   + val6.setScale(0, RoundingMode.DOWN));
System.out.println(val7 + "\t\t"   + val7.setScale(0, RoundingMode.DOWN));
System.out.println(val8 + "\t\t"   + val8.setScale(0, RoundingMode.DOWN));
System.out.println(val9 + "\t\t"   + val9.setScale(0, RoundingMode.DOWN));

输出结果:

1.9      1
1.5      1
1.4      1
1.1      1
1.0      1
-1.0    -1
-1.4    -1
-1.5    -1
-1.9    -1

5.3 CEILING

向正无穷舍入。如果结果为正数,则表现为 RoundingMode.UP;如果为负数,则表现为 RoundingMode.DOWN

代码示例:

// 构造 BigDecimal 对象
BigDecimal val1 = new BigDecimal("1.6");
BigDecimal val2 = new BigDecimal("1.5");
BigDecimal val3 = new BigDecimal("1.4");
BigDecimal val4 = new BigDecimal("1.1");
BigDecimal val5 = new BigDecimal("1.0");
BigDecimal val6 = new BigDecimal("-1.0");
BigDecimal val7 = new BigDecimal("-1.4");
BigDecimal val8 = new BigDecimal("-1.5");
BigDecimal val9 = new BigDecimal("-1.6");

// 设置精度和舍入模式
System.out.println(val1 + "\t\t\t" + val1.setScale(0, RoundingMode.CEILING));
System.out.println(val2 + "\t\t\t" + val2.setScale(0, RoundingMode.CEILING));
System.out.println(val3 + "\t\t\t" + val3.setScale(0, RoundingMode.CEILING));
System.out.println(val4 + "\t\t\t" + val4.setScale(0, RoundingMode.CEILING));
System.out.println(val5 + "\t\t\t" + val5.setScale(0, RoundingMode.CEILING));
System.out.println(val6 + "\t\t"   + val6.setScale(0, RoundingMode.CEILING));
System.out.println(val7 + "\t\t"   + val7.setScale(0, RoundingMode.CEILING));
System.out.println(val8 + "\t\t"   + val8.setScale(0, RoundingMode.CEILING));
System.out.println(val9 + "\t\t"   + val9.setScale(0, RoundingMode.CEILING));

输出结果:

1.9      2
1.5      2
1.4      2
1.1      2
1.0      1
-1.0    -1
-1.4    -1
-1.5    -1
-1.9    -1

5.4 FLOOR

向负无穷舍入。如果结果为正数,则表现为 RoundingMode.DOWN ;如果为负数,则表现为 RoundingMode.UP

代码示例:

// 构造 BigDecimal 对象
BigDecimal val1 = new BigDecimal("1.6");
BigDecimal val2 = new BigDecimal("1.5");
BigDecimal val3 = new BigDecimal("1.4");
BigDecimal val4 = new BigDecimal("1.1");
BigDecimal val5 = new BigDecimal("1.0");
BigDecimal val6 = new BigDecimal("-1.0");
BigDecimal val7 = new BigDecimal("-1.4");
BigDecimal val8 = new BigDecimal("-1.5");
BigDecimal val9 = new BigDecimal("-1.6");

// 设置精度和舍入模式
System.out.println(val1 + "\t\t\t" + val1.setScale(0, RoundingMode.FLOOR));
System.out.println(val2 + "\t\t\t" + val2.setScale(0, RoundingMode.FLOOR));
System.out.println(val3 + "\t\t\t" + val3.setScale(0, RoundingMode.FLOOR));
System.out.println(val4 + "\t\t\t" + val4.setScale(0, RoundingMode.FLOOR));
System.out.println(val5 + "\t\t\t" + val5.setScale(0, RoundingMode.FLOOR));
System.out.println(val6 + "\t\t"   + val6.setScale(0, RoundingMode.FLOOR));
System.out.println(val7 + "\t\t"   + val7.setScale(0, RoundingMode.FLOOR));
System.out.println(val8 + "\t\t"   + val8.setScale(0, RoundingMode.FLOOR));
System.out.println(val9 + "\t\t"   + val9.setScale(0, RoundingMode.FLOOR));

输出结果:

1.9      1
1.5      1
1.4      1
1.1      1
1.0      1
-1.0    -1
-1.4    -2
-1.5    -2
-1.9    -2

5.5 HALF_UP

向“最接近的”数字舍入,也是我们通常说的“四舍五入”。

代码示例:

// 构造 BigDecimal 对象
BigDecimal val1 = new BigDecimal("1.6");
BigDecimal val2 = new BigDecimal("1.5");
BigDecimal val3 = new BigDecimal("1.4");
BigDecimal val4 = new BigDecimal("1.1");
BigDecimal val5 = new BigDecimal("1.0");
BigDecimal val6 = new BigDecimal("-1.0");
BigDecimal val7 = new BigDecimal("-1.4");
BigDecimal val8 = new BigDecimal("-1.5");
BigDecimal val9 = new BigDecimal("-1.6");

// 设置精度和舍入模式
System.out.println(val1 + "\t\t\t" + val1.setScale(0, RoundingMode.HALF_UP));
System.out.println(val2 + "\t\t\t" + val2.setScale(0, RoundingMode.HALF_UP));
System.out.println(val3 + "\t\t\t" + val3.setScale(0, RoundingMode.HALF_UP));
System.out.println(val4 + "\t\t\t" + val4.setScale(0, RoundingMode.HALF_UP));
System.out.println(val5 + "\t\t\t" + val5.setScale(0, RoundingMode.HALF_UP));
System.out.println(val6 + "\t\t"   + val6.setScale(0, RoundingMode.HALF_UP));
System.out.println(val7 + "\t\t"   + val7.setScale(0, RoundingMode.HALF_UP));
System.out.println(val8 + "\t\t"   + val8.setScale(0, RoundingMode.HALF_UP));
System.out.println(val9 + "\t\t"   + val9.setScale(0, RoundingMode.HALF_UP));

输出结果:

1.9      2
1.5      2
1.4      1
1.1      1
1.0      1
-1.0    -1
-1.4    -1
-1.5    -2
-1.9    -2

5.6 HALF_DOWN

向“最邻近”的数字舍入,也就是“五舍六入”

代码示例:

// 构造 BigDecimal 对象
BigDecimal val1 = new BigDecimal("1.6");
BigDecimal val2 = new BigDecimal("1.5");
BigDecimal val3 = new BigDecimal("1.4");
BigDecimal val4 = new BigDecimal("1.1");
BigDecimal val5 = new BigDecimal("1.0");
BigDecimal val6 = new BigDecimal("-1.0");
BigDecimal val7 = new BigDecimal("-1.4");
BigDecimal val8 = new BigDecimal("-1.5");
BigDecimal val9 = new BigDecimal("-1.6");

// 设置精度和舍入模式
System.out.println(val1 + "\t\t\t" + val1.setScale(0, RoundingMode.HALF_DOWN));
System.out.println(val2 + "\t\t\t" + val2.setScale(0, RoundingMode.HALF_DOWN));
System.out.println(val3 + "\t\t\t" + val3.setScale(0, RoundingMode.HALF_DOWN));
System.out.println(val4 + "\t\t\t" + val4.setScale(0, RoundingMode.HALF_DOWN));
System.out.println(val5 + "\t\t\t" + val5.setScale(0, RoundingMode.HALF_DOWN));
System.out.println(val6 + "\t\t"   + val6.setScale(0, RoundingMode.HALF_DOWN));
System.out.println(val7 + "\t\t"   + val7.setScale(0, RoundingMode.HALF_DOWN));
System.out.println(val8 + "\t\t"   + val8.setScale(0, RoundingMode.HALF_DOWN));
System.out.println(val9 + "\t\t"   + val9.setScale(0, RoundingMode.HALF_DOWN));

输出结果:

1.9      2
1.5      1
1.4      1
1.1      1
1.0      1
-1.0    -1
-1.4    -1
-1.5    -1
-1.9    -2

5.7 HALF_EVEN

该舍入模式分两种情况:如果“废弃数”左边的数字为奇数,则与 HALF_UP 相同;如果为偶数,则与 HALF_DOWN 相同。

“废弃数”左边的数字为奇数,代码示例:

// 构造 BigDecimal 对象
BigDecimal val1 = new BigDecimal("1.9");
BigDecimal val2 = new BigDecimal("1.5");
BigDecimal val3 = new BigDecimal("1.4");
BigDecimal val4 = new BigDecimal("1.1");
BigDecimal val5 = new BigDecimal("1.0");
BigDecimal val6 = new BigDecimal("-1.0");
BigDecimal val7 = new BigDecimal("-1.4");
BigDecimal val8 = new BigDecimal("-1.5");
BigDecimal val9 = new BigDecimal("-1.9");

// 设置精度和舍入模式
System.out.println(val1 + "\t\t\t" + val1.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val2 + "\t\t\t" + val2.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val3 + "\t\t\t" + val3.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val4 + "\t\t\t" + val4.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val5 + "\t\t\t" + val5.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val6 + "\t\t"   + val6.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val7 + "\t\t"   + val7.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val8 + "\t\t"   + val8.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val9 + "\t\t"   + val9.setScale(0, RoundingMode.HALF_EVEN));

输出结果:

1.9      2
1.5      2
1.4      1
1.1      1
1.0      1
-1.0    -1
-1.4    -1
-1.5    -2
-1.9    -2

“废弃数”左边的数字为偶数,代码示例:

// 构造 BigDecimal 对象
BigDecimal val1 = new BigDecimal("2.6");
BigDecimal val2 = new BigDecimal("2.5");
BigDecimal val3 = new BigDecimal("2.4");
BigDecimal val4 = new BigDecimal("2.1");
BigDecimal val5 = new BigDecimal("2.0");
BigDecimal val6 = new BigDecimal("-2.0");
BigDecimal val7 = new BigDecimal("-2.4");
BigDecimal val8 = new BigDecimal("-2.5");
BigDecimal val9 = new BigDecimal("-2.6");

// 设置精度和舍入模式
System.out.println(val1 + "\t\t\t" + val1.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val2 + "\t\t\t" + val2.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val3 + "\t\t\t" + val3.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val4 + "\t\t\t" + val4.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val5 + "\t\t\t" + val5.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val6 + "\t\t"   + val6.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val7 + "\t\t"   + val7.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val8 + "\t\t"   + val8.setScale(0, RoundingMode.HALF_EVEN));
System.out.println(val9 + "\t\t"   + val9.setScale(0, RoundingMode.HALF_EVEN));

输出结果:

2.6      3
2.5      2
2.4      2
2.1      2
2.0      2
-2.0    -2
-2.4    -2
-2.5    -2
-2.6    -3

5.8 UNNECESSARY

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


热门专栏

👍 《Python入门核心技术》
👍 《IDEA 教程:从入门到精通》
👍 《Java 教程:从入门到精通》
👍 《MySQL 教程:从入门到精通》
👍 《大数据核心技术从入门到精通》

Java 数学计算(一):BigDecimal 详解 + 代码示例文章来源地址https://www.toymoban.com/news/detail-401462.html

到了这里,关于Java 数学计算(一):BigDecimal 详解 + 代码示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2023年MathorCup 高校数学建模挑战赛-A 题 量子计算机在信用评分卡组合优化中的应用-思路详解(模型代码答案)

    运筹优化类题目,不同于目标规划,该题限制了必须使用量子退火算法QUBO来进行建模与求解。本身题目并不难,但是该模型较生僻,给出的参考文献需要耗费大量时间去钻研。建议擅长运筹类题目且建模能力强的队伍选择。 问题 1 :在 100 个信用评分卡中找出 1 张及其对应阈

    2024年02月06日
    浏览(38)
  • 3.2. 数学类(Math、BigInteger、BigDecimal)

    1. Math类 Math 类提供了一些基本的数学函数,如求平方根、绝对值、三角函数等。它是一个 final 类,并且所有的方法都是 static 的,因此无需创建对象,直接使用类名调用方法即可。 以下是 Math 类的一些常用方法: abs(double a) :返回参数的绝对值。 ceil(double a) :返回大于或等

    2024年02月07日
    浏览(34)
  • python机器学习经典算法代码示例及思维导图(数学建模必备)

    最近几天学习了机器学习经典算法,通过此次学习入门了机器学习,并将经典算法的代码实现并记录下来,方便后续查找与使用。 这次记录主要分为两部分:第一部分是机器学习思维导图,以框架的形式描述机器学习开发流程,并附有相关的具体python库,做索引使用;第二部

    2024年02月12日
    浏览(35)
  • C语言标准库(常用函数)详解(含示例)数学公式:math.h

    目录 math.h的介绍 math.h的概述 库中定义的宏: HUGE_VAL 库函数(只讲解常用函数) 三角函数 示例代码 输出 双曲函数 示例代码 输出 指数和对数函数(只含常用函数) 示例代码  输出 常用函数pow,sprt,cbrt,hypot,fabs,abs 代码示例 输出 math.h 一般见于C,C++程序设计, #includema

    2024年02月09日
    浏览(38)
  • 贪心算法思想详解+示例代码

    CSDN话题挑战赛第2期 参赛话题:学习笔记 分治思想 贪心算法/贪婪算法 动态规划 动态回溯 分支定界 今天我们来学习贪心算法。 什么是贪心算法,顾名思义,就是你要贪,做题要学会 贪 。 实际上,贪心算法就是 把大的问题归纳成小问题 ,然后得到解决的思想,贪心算法是

    2024年02月07日
    浏览(40)
  • BigDecimal常用计算

     

    2024年02月01日
    浏览(28)
  • 数学建模之“TOPSIS数学模型”原理和代码详解

    TOPSIS(Technique for Order Preference by Similarity to Ideal Solution)是一种多准则决策分析方法, 用于解决多个候选方案之间的排序和选择问题 。它基于一种数学模型, 通过比较每个候选方案与理想解和负理想解之间的相似性来评估其优劣。 TOPSIS方法包括以下步骤: 确定决策准则:

    2024年02月12日
    浏览(38)
  • MyBatis 执行流程详解及示例代码

    MyBatis 是一个优秀的持久层框架,它简化了数据库操作的开发过程。本文将详细介绍 MyBatis 的执行流程,并提供相应的示例代码,帮助读者更好地理解和应用 MyBatis。 在 MyBatis 中,首先需要创建一个 SqlSessionFactoryBuilder 对象,并加载 MyBatis 的配置文件。这个对象用于构建 SqlS

    2024年02月11日
    浏览(44)
  • 项目|金额场景计算&BigDecimal使用简记

    前言         在实际项目开发中,我们经常会遇到一些金额计算,分摊等问题,通常我们都使用java.math.BigDecimal 来完成各种计算,避免使用浮点数float,double来计算金额,以免丢失精度,以下是博主部分使用场景和使用BigDecimal简记分享。。 案例1:统计各年龄段,用户存款

    2024年02月08日
    浏览(33)
  • 分享BigDecimal金额计算的4种方式

    基本介绍 金额计算这块通常都是基于2位小数的四舍五入,如果是自己的系统内部功能金额位数一般都是固定的,在正常的加减乘除运算逻辑都是保留同样位数的,但是乘法和除法相对比较特殊,在计算小数的部分可能会计算出更多位数的小数点,如若需要将计算后的金额数

    2023年04月23日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包