Android技术研究安卓笔记侠Android探索之旅

Java大数类BigDecimal及八种舍入模式的介绍

2016-07-12  本文已影响869人  亦枫

BigDecimal的引入


在利用Java编程语言开发银行、金融类等需要对数值进行高精度计算的软件时,我们经常使用BigDecimalBigInteger这两个大数类,而不是常见的int、long、float、double类型,特别是在处理浮点型数据。

我们先看一下使用基础数据类型double进行计算并打印结果的一个代码演示:

public class MainClass {
  
    public static void main(String[] args) {
        System.out.println(0.02+0.01);
        System.out.println(0.05+0.01);
    }
    
}

结果如下:

0.03
0.060000000000000005

问题来了,为什么会出现第二种结果的数据呢?根本原因还是我们的计算机是由二进制的,而二进制是没办法来精确表示一个浮点数,CPU采用“尾数和指数”的方式(科学计数法)表达浮点数的时候存在一定的误差。所以,当对数据精度要求比较高的时候,还是需要采用BigDecimal类,尽管计算速度上稍微慢了一些。

BigDecimal的使用


创建一个BigDecimal对象有构造函数和公有静态方法(BigDecimal.valueOf)两种方式,需要注意两点:

BigDecimal舍入模式


尽管数据库存储的是一个高精度的浮点数,但是通常在应用中展示的时候往往需要限制一下小数点的位数,比如两到三位小数即可,这时就需要使用到setScale(int newScale, int roundingMode)函数,作为BigDecimal的公有静态变量,舍入模式(Rounding Mode)的运算规则比较多,公有八种,这里作个说明,官方文档也有介绍。

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

INPUT_NUM UP DOWN CEILING FLOOR HALF_UP HALF_DOWN HALF_EVEN UNNECESSARY
5.5 6 5 6 5 6 5 6 Exception
2.5 3 2 3 2 3 2 2 Exception
1.6 2 1 2 1 2 2 2 Exception
1.1 2 1 2 1 1 1 1 Exception
1.0 1 1 1 1 1 1 1 Exception
-1.0 -1 -1 -1 -1 -1 -1 -1 Exception
-1.1 -2 -1 -1 -2 -1 -1 -1 Exception
-1.6 -2 -1 -1 -2 -2 -2 -2 Exception
-2.5 -3 -2 -2 -3 -3 -2 -2 Exception
-5.5 -6 -5 -5 -6 -6 -5 -6 Exception
上一篇下一篇

猜你喜欢

热点阅读