美文网首页
Java BigDecimal 精确浮点型

Java BigDecimal 精确浮点型

作者: 强大帅 | 来源:发表于2021-02-26 11:39 被阅读0次

为什么要使用BigDecimal

说到java中的浮点型,大家主要用的还是floatdouble,但这两种浮点型的精度都是有限的,一般情况下只是一个近似值,永远不要相信浮点数结果精确到了最后一位,也永远不要相信两个浮点数是否相等。但在有些情况下,比如财务系统中,对于精度要求很高,这里Java提供了一个BigDecimal类。

构造方法

BigDecimal(int)       创建一个具有参数所指定整数值的对象。 
BigDecimal(double) 创建一个具有参数所指定双精度值的对象。 //禁止使用
BigDecimal(long)    创建一个具有参数所指定长整数值的对象。 
BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。//推荐使用

为何禁止使用BigDecimal(double)


看上面代码运行结果,你就应该知道为什么不推荐使用了,因为用这种方式也会导致计算有问题

为什么会出现这种情况呢?

JDK的描述:1、参数类型为double的构造方法的结果有一定的不可预知性。有人可能认为在Java中写入newBigDecimal(0.1)所创建的BigDecimal正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。

另一方面,String 构造方法是完全可预知的:写入 newBigDecimal("0.1") 将创建一个 BigDecimal,它正好等于预期的 0.1。因此,比较而言,通常建议优先使用String构造方法

静态方法 valueOf(double val) 内部实现,仍是将 double 类型转为 String 类型; 这通常是将 double(或float)转化为 BigDecimal 的首选方法

方法描述

add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
toString() 将BigDecimal对象的数值转换成字符串。
doubleValue() 将BigDecimal对象中的值以双精度数返回。
floatValue() 将BigDecimal对象中的值以单精度数返回。
longValue() 将BigDecimal对象中的值以长整数返回。
intValue() 将BigDecimal对象中的值以整数返回。

当double必须用作BigDecimal的源时,请使用Double.toString(double)转成String,然后使用String构造方法,或使用BigDecimal的静态方法valueOf,如下

static BigDecimal valueOf(double d); //常用,推荐使用

使用方法


这边特别提一下,如果进行除法运算的时候,结果不能整除,有余数,这个时候会报java.lang.ArithmeticException:,这边我们要避免这个错误产生,在进行除法运算的时候,针对可能出现的小数产生的计算,必须要多传两个参数
divide(BigDecimal,保留小数点后几位小数舍入模式)

舍入模式

ROUND_CEILING //向正无穷方向舍入
ROUND_DOWN //向零方向舍入
ROUND_FLOOR //向负无穷方向舍入
ROUND_HALF_DOWN //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5
ROUND_HALF_EVEN //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
ROUND_HALF_UP //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6,也就是我们常说的“四舍五入
ROUND_UNNECESSARY //计算结果是精确的,不需要舍入模式
ROUND_UP //向远离0的方向舍入

需要对BigDecimal进行截断和四舍五入可用setScale方法,例:

参考链接
java 中 BigDecimal 详解

相关文章

  • Java BigDecimal 精确浮点型

    为什么要使用BigDecimal 说到java中的浮点型,大家主要用的还是float和double,但这两种浮点型...

  • [Java] BigDecimal的使用

    BigDecimal BigDecimal位于java.math.BigDecimal包,用于处理浮点数高精度运算...

  • BigDecimal 一定不会丢失精度吗?

    前言 API BigDecimal精度也丢失 正确运用BigDecimal 我们都知道浮点型变量在进行计算的时候会...

  • java浮点型精度丢失浅析

    java浮点型数值在运算中会出现精度损失的情况,在业务要求比较高比如交易等场景,一般使用BigDecimal来解决...

  • 2019-04-10

    浮点数的精确计算用BigDecimal switch-case: 匹配成功会返回当前的case值,若有break则...

  • NDK - JNI java类型转C++

    1、Java String 转 C++ String 2、 java 浮点型数组 转 C++ 浮点型数组 3、 ...

  • Java中new BigDecimal(double val)的

    在计算机中浮点数有可能是不准确的,它只能无限接近准确值,不能完全精确。new BigDecimal(double)...

  • Awesome Java

    基础 Java 入门与实践 Java 语法清单 Java 8 系列之重新认识 HashMap Java 浮点数精确...

  • BigDecimal大精度小数

    BigDecimal用于精度计算 输出结果: 在计算数值的时候,由于浮点数没有办法精确的对二进制进行计算,所以经常...

  • Java基础: 基本类型和字符串对象

    1、基本类型 Java的基本类型有整型、浮点型、字符型和布尔型。整型:byte、short、int、long浮点型...

网友评论

      本文标题:Java BigDecimal 精确浮点型

      本文链接:https://www.haomeiwen.com/subject/rjrmfltx.html