Java中使用BigDecimal进行精确运算

发布时间 - 2026-01-10 23:12:09    点击率:

首先我们先来看如下代码示例:

public class Test_1 {
  public static void main(String[] args) {
    System.out.println(0.06+0.01);
    System.out.println(1.0-0.42);
    System.out.println(4.015*100);
    System.out.println(303.1/1000);
  }
}

运行结果如下。

         0.06999999999999999

         0.5800000000000001

         401.49999999999994

         0.30310000000000004

         你认为你看错了,但结果却是是这样的。问题在哪里呢?原因在于我们的计算机是二进制的。浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。如:2.4的二进制表示并非就是精确的2.4。反而最为接近的二进制表示是 2.3999999999999999。浮点数的值实际上是由一个特定的数学公式计算得到的。

          其实java的float只能用来进行科学计算或工程计算,在大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算。

          在使用BigDecimal类来进行计算的时候,主要分为以下步骤:

              1、用float或者double变量构建BigDecimal对象。

             2、通过调用BigDecimal的加,减,乘,除等相应的方法进行算术运算。

             3、把BigDecimal对象转换成float,double,int等类型。

          一般来说,可以使用BigDecimal的构造方法或者静态方法的valueOf()方法把基本类型的变量构建成BigDecimal对象。

 BigDecimal b1 = new BigDecimal(Double.toString(0.48));
BigDecimal b2 = BigDecimal.valueOf(0.48);

       对于常用的加,减,乘,除,BigDecimal类提供了相应的成员方法。

 public BigDecimal add(BigDecimal value);            //加法
 public BigDecimal subtract(BigDecimal value);          //减法 
 public BigDecimal multiply(BigDecimal value);          //乘法
 public BigDecimal divide(BigDecimal value);           //除法

          进行相应的计算后,我们可能需要将BigDecimal对象转换成相应的基本数据类型的变量,可以使用floatValue(),doubleValue()等方法。

          下面是一个工具类,该工具类提供加,减,乘,除运算。

public class Arith {
  /**
   * 提供精确加法计算的add方法
   * @param value1 被加数
   * @param value2 加数
   * @return 两个参数的和
   */
  public static double add(double value1,double value2){
    BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
    BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
    return b1.add(b2).doubleValue();
  }
  /**
   * 提供精确减法运算的sub方法
   * @param value1 被减数
   * @param value2 减数
   * @return 两个参数的差
   */
  public static double sub(double value1,double value2){
    BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
    BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
    return b1.subtract(b2).doubleValue();
  }
  /**
   * 提供精确乘法运算的mul方法
   * @param value1 被乘数
   * @param value2 乘数
   * @return 两个参数的积
   */
  public static double mul(double value1,double value2){
    BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
    BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
    return b1.multiply(b2).doubleValue();
  }
  /**
   * 提供精确的除法运算方法div
   * @param value1 被除数
   * @param value2 除数
   * @param scale 精确范围
   * @return 两个参数的商
   * @throws IllegalAccessException
   */
  public static double div(double value1,double value2,int scale) throws IllegalAccessException{
    //如果精确范围小于0,抛出异常信息
    if(scale<0){     
      throw new IllegalAccessException("精确度不能小于0");
    }
    BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
    BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
    return b1.divide(b2, scale).doubleValue();  
  }
}

以上所述是小编给大家介绍的Java中使用BigDecimal进行精确运算,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# bigdecimal运算  # Java中使用BigDecimal进行浮点数运算  # Java BigDecimal使用及基本运算(推荐)  # Java使用BigDecimal进行运算封装的实际案例  # Java中BigDecimal的基本运算(详解)  # 【Java】BigDecimal实现加减乘除运算代码  # Java使用BigDecimal精确运算浮点数  # 浮点数  # 可以使用  # 转换成  # 小编  # 是一个  # 也会  # 却是  # 在此  # 是这样  # 是由  # 你看  # 错了  # 给大家  # 没有办法  # 你认为  # 所述  # 抛出  # 给我留言  # 感谢大家  # 疑问请 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  如何用低价快速搭建高质量网站?  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  再谈Python中的字符串与字符编码(推荐)  用v-html解决Vue.js渲染中html标签不被解析的问题  Laravel如何创建自定义中间件?(Middleware代码示例)  Laravel如何实现用户注册和登录?(Auth脚手架指南)  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  如何安全更换建站之星模板并保留数据?  三星网站视频制作教程下载,三星w23网页如何全屏?  HTML 中如何正确使用模板变量为元素的 name 属性赋值  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  怎么用AI帮你设计一套个性化的手机App图标?  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  如何快速搭建支持数据库操作的智能建站平台?  JavaScript如何实现路由_前端路由原理是什么  如何在 React 中条件性地遍历数组并渲染元素  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  linux top下的 minerd 木马清除方法  想要更高端的建设网站,这些原则一定要坚持!  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  如何快速使用云服务器搭建个人网站?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  如何基于云服务器快速搭建网站及云盘系统?  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  如何实现建站之星域名转发设置?  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  javascript读取文本节点方法小结  如何在万网主机上快速搭建网站?  如何选择可靠的免备案建站服务器?  浅谈javascript alert和confirm的美化  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  Python图片处理进阶教程_Pillow滤镜与图像增强  如何快速重置建站主机并恢复默认配置?  Bootstrap整体框架之JavaScript插件架构  如何正确选择百度移动适配建站域名?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  如何在建站主机中优化服务器配置?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  如何快速上传自定义模板至建站之星?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  香港服务器租用每月最低只需15元?  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  详解jQuery停止动画——stop()方法的使用  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  简历在线制作网站免费版,如何创建个人简历?  如何在服务器上三步完成建站并提升流量?