当前位置: 首页 > news >正文

金额高精度计算-BigDecimal

Java 中用于精确表示和计算任意精度十进制数的类,在金融、科学计算等对精度要求较高的场景中广泛使用
1. 高精度计算

float 和 double 类型在处理十进制数时,由于采用二进制存储,可能会出现精度丢失问题。而 BigDecimal 可以精确表示和计算十进制数,避免了精度丢失。

public class BigDecimalExample {public static void main(String[] args) {double a = 0.1;double b = 0.2;// 输出结果可能存在精度丢失System.out.println(a + b); BigDecimal bdA = new BigDecimal("0.1");BigDecimal bdB = new BigDecimal("0.2");// 输出结果精确为 0.3System.out.println(bdA.add(bdB)); }
}

2. 不可变性

BigDecimal 对象是不可变的,即一旦创建,其值就不能被修改。每次对 BigDecimal 对象进行运算操作时,都会返回一个新的 BigDecimal 对象。

public class BigDecimalImmutability {public static void main(String[] args) {BigDecimal num1 = new BigDecimal("10");BigDecimal num2 = num1.add(new BigDecimal("5"));// 输出 10,num1 的值并未改变System.out.println(num1); // 输出 15,num2 是新的对象System.out.println(num2); }
}

3. 丰富的运算方法

BigDecimal 提供了丰富的运算方法,如加法(add)、减法(subtract)、乘法(multiply)、除法(divide)等。

public class BigDecimalOperations {public static void main(String[] args) {BigDecimal num1 = new BigDecimal("10");BigDecimal num2 = new BigDecimal("3");// 加法BigDecimal sum = num1.add(num2);// 减法BigDecimal difference = num1.subtract(num2);// 乘法BigDecimal product = num1.multiply(num2);// 除法,需要指定精度和舍入模式BigDecimal quotient = num1.divide(num2, 2, BigDecimal.ROUND_HALF_UP);System.out.println("Sum: " + sum);System.out.println("Difference: " + difference);System.out.println("Product: " + product);System.out.println("Quotient: " + quotient);}
}

4. 自定义舍入模式

在进行除法运算或设置小数位数时,BigDecimal 允许用户指定舍入模式,常见的舍入模式有 ROUND_HALF_UP(四舍五入)、ROUND_DOWN(直接截断)等

public class BigDecimalRounding {public static void main(String[] args) {BigDecimal num = new BigDecimal("3.14159");// 四舍五入保留两位小数BigDecimal rounded = num.setScale(2, BigDecimal.ROUND_HALF_UP);System.out.println(rounded); }
}

5. 比较大小

BigDecimal 提供了 compareTo 方法用于比较两个 BigDecimal 对象的大小,该方法返回一个整数,分别表示小于(-1)、等于(0)、大于(1)

public class BigDecimalComparison {public static void main(String[] args) {BigDecimal num1 = new BigDecimal("10");BigDecimal num2 = new BigDecimal("20");int result = num1.compareTo(num2);if (result < 0) {System.out.println("num1 小于 num2");} else if (result == 0) {System.out.println("num1 等于 num2");} else {System.out.println("num1 大于 num2");}}
}

6. 构造方法

BigDecimal 提供了多种构造方法,建议使用 String 类型的构造方法来创建对象,避免使用 double 类型的构造方法,因为 double 类型可能存在精度丢失问题。

public class BigDecimalConstructor {public static void main(String[] args) {// 推荐使用 String 类型的构造方法BigDecimal num1 = new BigDecimal("0.1"); // 不推荐使用 double 类型的构造方法,可能存在精度丢失BigDecimal num2 = new BigDecimal(0.1); System.out.println(num1); System.out.println(num2); }
}

相关文章:

  • .NET WinForm图像识别二维码/条形码
  • Day39
  • 【Pandas】pandas DataFrame equals
  • 构筑电网“无形防线”: 防外破告警在线监测服务系统
  • 数据结构 -- 判断正误
  • 【数据结构】栈和队列(下)
  • 从零开始创建 Vue 3 开发环境并构建第一个 Demo
  • 【Pandas】pandas DataFrame duplicated
  • Opencv实用操作5 图像腐蚀膨胀
  • WPF log4net用法
  • Facebook 的隐私保护措施是否足够?技术观点
  • 1614. 括号的最大嵌套深度【 力扣(LeetCode) 】
  • LVS+KeepAlived
  • ansible template 文件中如果包含{{}} 等非ansible 变量处理
  • 【python深度学习】Day 39 图像数据与显存
  • 关于 JavaScript 版本、TypeScript、Vue 的区别说明, PHP 开发者入门 Vue 的具体方案
  • 2.spring基础入门(二)
  • 充电便捷,新能源汽车移动充电服务如何预约充电
  • 数字孪生数据监控如何提升汽车零部件工厂产品质量
  • 汽车制造场景下Profibus转Profinet网关核心功能与应用解析
  • 桂城网站制作/百度怎么发自己的小广告
  • 广州网站建设推广服务/百度快照是啥
  • 那些做测评的网站好/免费手游推广平台
  • 深圳企业公司做网站/谷歌首页
  • 平凉网站设计/哈尔滨优化网站公司
  • 南京建设网站排名/百度手机端推广