• 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。好处是你会避免任何的舍入误差。

  • 相关阅读:
    ASM:《X86汇编语言-从实模式到保护模式》第9章:实模式下中断机制和实时时钟
    iOS回顾笔记(07) -- UITableView的使用和性能优化
    appledoc导出iOS代码文档的使用和问题详解(干货篇)
    iOS回顾笔记(06) -- AutoLayout从入门到精通
    iOS回顾笔记(05) -- 手把手教你封装一个广告轮播图框架
    iOS回顾笔记(04) -- UIScrollView的基本使用详解
    iOS回顾笔记(03) -- 自定义View的封装和xib文件的使用详解
    iOS回顾笔记( 02 ) -- 由九宫格布局引发的一系列“惨案”
    iOS回顾笔记( 01 )-- XIB和纯代码创建应用的对比
    博客搬家
  • 原文地址:https://www.cnblogs.com/JackpotHan/p/9791310.html
Copyright © 2020-2023  润新知