ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

掌握Java BigDecimal:精确计算的终极指南

2026/8/10 9:46:54 拓冰建站 浏览量
掌握Java BigDecimal:精确计算的终极指南 日常工作里, 碰到了需要具备一定精度的计算情况, 在这个时候, 用到了类, 这篇文章记载学习它的运用方法。1.引言在工作中需要用到这是需要使用。先看下面代码( args).out.(0.2 0.1);.out.(0.3 - 0.1);.out.(0.2 * 0.1);.out.(0.3 / 0.1);运行结果如下你觉得你看错了, 然而结果确确实实就是如此。那问题究竟存于何处呢? 缘由在于我们所用的计算机是以二进制运行的。浮点数没办法借助二进制实现精确呈现。我们的CPU对浮点数的表示涵盖两个部分, 分别是指数和尾数, 这般的表示方式通常都会致使精度有所丧失, 部分浮点数运算同样会引发一定的误差情况。举例而言, 2.4的二进制表示并非精准的2.4。相反地, 最为接近它的二进制表示居然是 2.。浮点数的值实际上是通过一个特定的数学公式运算得出的。实际上, java当中的float仅仅能够用以开展科学计算或者工程计算, 于大多数的商业计算里, 通常会采用java.math.类去实施精确计算。2.构造方法1. ( val) 将表示形式转换为 *不建议使用2. (int val) 将int表示形式转换成3. ( val) 将表示形式转换成为什么不建议采用第一种构造方法呢来看例子( args) new (2); new (2.3); new (2.3);.out.( );.out.( );.out.( );运行结果如下为什么会出现这种情况呢描述JDK的情况, 参数类型为的构造方法, 其结果存在必然的不可确切预知特性。有人会觉得, 在Java里写入(0.1)所创建的数值恰好等于0.1 , 也就是非标度值1且标度为1的情况。然而, 实际上它等于0.。这是由于, 0.1没办法精准地被表示成, 或者说针对此情形, 无法被表示成任何具有有限长度的二进制小数。如此一来, 传入到构造方法里的值, 不会恰好等于0.1 , 尽管表面看上去等于这个值。2、另一方面, 构造方法具备完全的可预知性, 将“0.1”写入之后, 会创建出一个状态, 该状态恰好等同于预期的0.1。所以, 两相比较之下, 通常来讲, 优先选用构造方法是较为妥当的做法。在确实需要当作所用到的源之际, 要借助.()去达成转换, 进而借助构造方式, 或者采用其静态方式, 像下面这样。( args) .(2.3); new (.(2.3));.out.( );.out.( );结果如下3.加减乘除运算对于常用的加减乘除类提供了相应的成员方法。add( value);//加法( value);//减法( value);//乘法( value);//除法大概的用法如下( args)a new (4.5);b new (1.5);.out.(a b a.add(b));.out.(a - b a.(b));.out.(a * b a.(b));.out.(a / b a.(b));运行结果这里有一点需要注意的是除法运算.当进行除法运算时, 有可能会出现无法实现整除的情形, 犹如4.5除以1.3这般, 在此时就会产生报错, 报错内容为java.lang.: Non- ; no exact。其实方法有可以传三个参数( , int scale, int )第一参数表示除数第二个参数表示小数点后保留位数在作除法运算或者四舍五入的时候, 才会用到舍入模式, 舍入模式由第三个参数来表示, 舍模式有下面这几种。//向正无穷方向舍入//向零方向舍入//向负无穷方向舍入朝着距离最近的一边进行舍入, 若这两边对应的距离并非相等, 除非两边的距离表现为相等的情形, 要是遇此情况, 沿着向下的方向实施舍入, 就如同1.55保留一位小数后所获结果是1.5。向着距离最近的那一边进行舍入, 不过要排除两边距离相等的情况, 要是这种两边距离相等的情况出现了, 倘若保留的位数属于奇数, 那就采用一种方式, 要是保留位数是偶数, 那就采用另一种方式, 使用相应方式, 有相应使用情况。向着离其最近的那一边进行舍入, 唯有两边的距离并非相等的情形之下才可以, 要是两边的距离相等了, 那就朝着上方进行舍入, 1.55保留一位小数所得到的结果是1.6。//计算结果是精确的不需要舍入模式//向远离0的方向舍入按照各自的需要可传入合适的第三个参数。四舍五入采用需要对进行截断和四舍五入可用方法例( args)a new (4.5635);将a赋值为, 对a进行操作, 保留三位小数, 并且按照四舍五入规则进行处理。.out.(a);*减法、乘法、除法计算, 实际上最后返回的都是一个全新的对象, 这是由于减法运算与乘法运算还有除法运算所涉及的对象都是不可改变状态的那种, 在开展每一步相应运算之际, 都必然会生成一个全新的对象。( args)a new (4.5);b new (1.5);a.add(b);.out.(a); 此操作会输出4.5 , 加减乘除相应方法会返回名为一个新的对象, 并且原来的a保持不变。4.总结(1)商业计算使用。(2)尽量使用参数类型为的构造函数。(3) 所有皆是不可改变的那种情况在开展每一步运算期间均会生成一个全新对象故而于做加减乘除运算之际务必得妥善留存操作之后的数值。(4)我们常常易于忽视JDK基础层面的某些达成细微之处, 致使产生差错, 应当予以更多留意。