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

BigDecimal使用中的一些注意事项

Java的商业计算,不能用float和double,因为他们无法进行精确计算。但是Java的设计者给编程人员提供了一个很有用的类BigDecimal,他可以完善float和double类无法进行精确计算的缺憾。

BigDecimal类位于java.maths类包下。及在商业或银行开发总,涉及到金钱或者倍率的情况下,都用bigdecimal格式。
BigDecimal常用的方法

  • public BigDecimal add(BigDecimal augend):加
  • public BigDecimal subtract(BigDecimal subtrahend):减
  • public BigDecimal multiply(BigDecimal multiplicand):乘
  • public BigDecimal divide(BigDecimal divisor):除
  • public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode):除数,几位小数,如何舍取。

对于BigDecimals您可以同时指定舍入模式和精度,但有一个更方便的方法 - 您可以使用MathContext代替,其中包含精度和舍入的信息。
使用MathContext进行加减运算可以直接操作(会丢失精度),但对于乘除最好规定一个DECIMAL*上下文,它们是必需的,因为当运算结果有一个无限长的十进制扩展,这些操作需要指定精度。否则会报ArithmeticException错误。

下面看看Demo

public class BigDecimalTest {
    public static void main(String[] args) {
        BigDecimal b1 = new BigDecimal(13.14);
        BigDecimal b2 = new BigDecimal(5.20);
        MathContext mc = new MathContext(4);
       
        BigDecimal b3 = b1.add(b2,mc);
        BigDecimal b4 = b1.subtract(b2);
        BigDecimal b5 = b1.divide(b2);//报错java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
        BigDecimal b5 = b1.divide(b2,mc);
        BigDecimal b6 = b1.multiply(b2);//报错java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
        BigDecimal b6 = b1.multiply(b2,mc);
System.out.println(b3); System.out.println(b4); System.out.println(b5); System.out.println(b6); } }

另外,在做除法操作时,需要对被除数做非0判断,不然会报java.lang.ArithmeticException: Division by zero。

public class BigDecimalTest {
    public static void main(String[] args) {
        BigDecimal b1 = new BigDecimal(13.14);   
        MathContext mc = new MathContext(4);
        BigDecimal b2 = BigDecimal.ZERO;
        if (b2.intValue() != 0) {
            BigDecimal b8 = b1.divide(b2, mc);
            System.out.println(b8);
        }else {
            System.out.println("Division not zero");
        }
    }
}

对于double, 请不要将double转为BigDecimal,先将double转为String,再将String转为BigDecimal。
如果你的算术需要将一个字符串作为输入,将其直接转换为BigDecimal。好处是你会避免任何的舍入误差。

转载于:https://www.cnblogs.com/JackpotHan/p/9791310.html

相关文章:

  • 4 - MySQL:多表查询
  • 运算
  • 走进软件第一次作业——组建团队 第四组作业
  • 部署 Django
  • react学习三
  • javascript编写带阴历的黄历
  • AS导入项目报错:Plugin with id 'com.android.application' not found.
  • 2018.10.17 NOIP模拟 管道(状压dp)
  • flask_sqlalchemy
  • Python语言程序设计基础(3)—— 基本数据类型
  • c# 反射实现模型深拷贝
  • 迅速上手:使用taro构建微信小程序基础教程
  • 第二次做HDOJ 1051
  • Python学习-第2课(函数,函数文档)
  • P2245 星际导航
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • [译]前端离线指南(上)
  • 【comparator, comparable】小总结
  • angular2 简述
  • Docker入门(二) - Dockerfile
  • gf框架之分页模块(五) - 自定义分页
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • NSTimer学习笔记
  • 技术胖1-4季视频复习— (看视频笔记)
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 世界上最简单的无等待算法(getAndIncrement)
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 线性表及其算法(java实现)
  • 学习HTTP相关知识笔记
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 译自由幺半群
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • ​linux启动进程的方式
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (30)数组元素和与数字和的绝对差
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (一)UDP基本编程步骤
  • .mysql secret在哪_MYSQL基本操作(上)
  • .Net - 类的介绍
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .net 中viewstate的原理和使用
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .NET开发者必备的11款免费工具
  • @AliasFor注解
  • @Bean注解详解
  • @JoinTable会自动删除关联表的数据
  • [ C++ ] 继承
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [14]内置对象
  • [Android] Android ActivityManager
  • [BZOJ1877][SDOI2009]晨跑[最大流+费用流]
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [CSS]中子元素在父元素中居中