【BigDecimal类—常用API系列】解决java浮点计算精度损失问题

news2024/11/24 7:22:09

文章目录

    • Java浮点计算精度损失问题
    • BigDecimal进行精确运算的解决方案

Java浮点计算精度损失问题

BigDecimal它是干什么用的呢?什么是java浮点计算精度损失问题?我们先看一段代码,看这个代码有什么问题?再说BigDeimal这个类是干什么用的,这样会更好理解一些。

public class Test {
    public static void main(String[] args) {
        System.out.println(0.1 + 0.2);
        System.out.println(1.0 - 0.32);
        System.out.println(1.015 * 100);
        System.out.println(1.301 / 100);
    }
}

运行以上代码,我们会发现,结果并和我们想看到的不太一样。如下图所示
在这里插入图片描述

那这是为什么呢?其实这个就是java浮点计算精度损失问题,使用float和double会有精度丢失。其底层原理会涉及到很多计算机组成原理方面的知识,包括计算机中二进制和十进制之间的转换以及计算机对浮点数的存储等等,这里不深入讲解,作为开发人员知道有这个事情以及解决方案就好啦!经常在开发和金融财务有关系统的时候会涉及到这些方面的问题

BigDecimal进行精确运算的解决方案

使用float和double运算时会造成结果的不准确,因此浮点数运算的时候,我们可以使用java提供的BigDecimal,使用BigDecimal对小数进行运算的时候,会先将数字扩大N倍,同时保存精度,转为整数进行相应的运算,最后再转为小数。
具体使用方法可以看如下代码,有详细的注释讲解,可以很快掌握BigDecimal进行精确运算的方案。

public class Test2 {
    public static void main(String[] args) {
        // 目标:掌握BigDecimal进行精确运算的方案。
        double a = 0.1;
        double b = 0.2;

        // 1、把浮点型数据封装成BigDecimal对象,再来参与运算。
        // a、public BigDecimal(double val) 得到的BigDecimal对象是无法精确计算浮点型数据的。 注意:不推荐使用这个,
        // b、public BigDecimal(String val)  得到的BigDecimal对象是可以精确计算浮点型数据的。 可以使用。
        // c、public static BigDecimal valueOf(double val): 通过这个静态方法得到的BigDecimal对象是可以精确运算的。是最好的方案。
        BigDecimal a1 = BigDecimal.valueOf(a);
        BigDecimal b1 = BigDecimal.valueOf(b);

        // 2、public BigDecimal add(BigDecimal augend): 加法
        BigDecimal c1 = a1.add(b1);
        System.out.println(c1);

        // 3、public BigDecimal subtract(BigDecimal augend): 减法
        BigDecimal c2 = a1.subtract(b1);
        System.out.println(c2);

        // 4、public BigDecimal multiply(BigDecimal augend): 乘法
        BigDecimal c3 = a1.multiply(b1);
        System.out.println(c3);

        // 5、public BigDecimal divide(BigDecimal b): 除法
        BigDecimal c4 = a1.divide(b1);
        System.out.println(c4);

//        BigDecimal d1 = BigDecimal.valueOf(0.1);
//        BigDecimal d2 = BigDecimal.valueOf(0.3);
//        BigDecimal d3 = d1.divide(d2);
//        System.out.println(d3);

        // 6、public BigDecimal divide(另一个BigDecimal对象,精确几位,舍入模式) : 除法,可以设置精确几位。
        BigDecimal d1 = BigDecimal.valueOf(0.1);
        BigDecimal d2 = BigDecimal.valueOf(0.3);
        BigDecimal d3 = d1.divide(d2,  2, RoundingMode.HALF_UP); // 0.33
        System.out.println(d3);

        // 7、public double doubleValue() : 把BigDecimal对象又转换成double类型的数据。
        //print(d3);
        //print(c1);
        double db1 = d3.doubleValue();
        double db2 = c1.doubleValue();
        print(db1);
        print(db2);
    }

    public static void print(double a){
        System.out.println(a);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1306859.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode—113.路径总和II【中等】

2023每日刷题(五十七) Leetcode—113.路径总和II 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …

Javac编译原理

文章目录 1. Javac是什么2. Javac编译器的基本结构3. Javac工作原理分析 1. Javac是什么 Javac是一种编译器,能将一种语言规范转成另一种语言规范,javac编译器将Java编译器对所有机器都非常友好的一种语言。注意这种语言不是针对某个机器的,…

leetcode对称二叉树(每日一题)

https://leetcode.cn/problems/symmetric-tree/description/ 今天我们在来个题目,对称二叉树,其实这道题的思路我觉得和那到判断两棵树是不是相同的题目很相似,写这个题目的思路还是递归,但是我们看这个题目的时候需要注意的一个…

智能优化算法应用:基于猫群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于猫群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于猫群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.猫群算法4.实验参数设定5.算法结果6.参考文献7.MA…

python-爬取壁纸

代理池的,防止IP 被封 找到图片真实地址 现在看到的只是图片的预览地址 (previews) 1.检查: 2.鼠标变为箭头时查看网页源代码 关于怎样在源代码中找到图片的真实地址 ??? 为什么在源代码界面 ctrl f 时候搜索的是 .png ??? 首先图片地址是以 .j…

死锁(面试常问)

1.什么是死锁 简单来说就是一个线程加锁后解锁不了 一个线程,一把锁,线程连续加锁两次。如果这个锁是不可重入锁,会死锁。两个线程,两把锁。 举几个例子,1.钥匙锁车里了,车钥匙锁家里了。2. 现在有一本书…

MySQL低版本中:字符串中的数字、英文字符、汉字提取

我们如何提醒一个字段中的汉字和数字呢 高版本指mysql8.0以上 使用sql语句 SELECT REGEXP_REPLACE(column_name, [^\\p{Han}], ) AS chinese_characters FROM table_name;其中 column_name指名称列,table_name是表名 2.低版本使用 需要新建函数 DELIMITER $$DR…

phpstudy搭建WordPress教程

一、phpstudy新建配置WordPress 打开phpstudy,启动Apache(或者Nginx)和MySQL服务 来到数据库部分,点击[创建数据库],填写新建数据库的名称,用户名以及密码,完成后点击确认 来到网站部分&#x…

vue3 使用 Element-plus 的 el-pagination 分页组件时无法显示中文

使用element-puss框架,分页显示英文 解决方法 在main.ts element-puss,2.3.8版本后的, import zhCn from "element-plus/es/locale/lang/zh-cn"; element-puss,2.3.8版本以前的, import zhCn from "element-plus/lib/loc…

山西电力市场日前价格预测【2023-12-11】

日前价格预测 预测说明: 如上图所示,预测明日(2023-12-11)山西电力市场全天平均日前电价为535.55元/MWh。其中,最高日前电价为689.29元/MWh,预计出现在09:00。最低日前电价为422.38元/MWh,预计…

Vue2学习笔记(组件嵌套)

示例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>数据绑定</title><script type"…

lwIP 细节之六:connected、sent、poll 回调函数是何时调用的

使用 lwIP 协议栈进行 TCP 裸机编程&#xff0c;其本质就是编写协议栈指定的各种回调函数。将你的应用逻辑封装成函数&#xff0c;注册到协议栈&#xff0c;在适当的时候&#xff0c;由协议栈自动调用&#xff0c;所以称为回调。 注&#xff1a;除非特别说明&#xff0c;以下内…

大数据湖体系规划与建设方案:PPT全文51页,附下载

关键词&#xff1a;大数据解决方案&#xff0c;数据湖解决方案&#xff0c;数据数仓建设方案&#xff0c;大数据湖建设规划&#xff0c;大数据湖发展趋势 一、大数据湖体系规划与建设背景 在传统的企业信息化建设中&#xff0c;各个业务系统通常是独立建设的&#xff0c;导致…

打工人副业变现秘籍,某多/某手变现底层引擎-Stable Diffusion 黑白老照片上色修复

在这个时代,我们习惯于拥有高清、色彩丰富的照片,然而,那些古老的黑白色老照片由于年代的久远,往往会出现模糊、破损等现象。 那么今天要给大家介绍的是,用 Stable Diffusion 来修复老照片。 前段时间 ControlNet 的除了上线了“IP-Adapter”模型以外还增加另一个…

【云原生kubernets】Deployment的功能与应用

一、导读 所有的 Deployment 对象都是由 Kubernetes 集群中的 DeploymentController 进行管理&#xff0c;DeploymentController 会在启动时通过 Informer 监听三种不同资源的通知&#xff0c;Pod、ReplicaSet 和 Deployment&#xff0c;这三种资源的变动都会触发 DeploymentCo…

c JPEG RLE 霍夫曼 理解

表1&#xff1a; 1. 从图1可以理解&#xff1a;size &#xff08;二进制位数&#xff09; value&#xff08;十进制数取值范围&#xff09;code&#xff08;二进制代码&#xff09; 任何一个10进制数&#xff0c;不管正负&#xff0c;用二进制位数和二进制代码表示。 如&#…

千梦网创:赚钱就是服侍好双爹

“爹啊&#xff0c;我没钱用啦&#xff0c;给我啃一下。” 想赚钱&#xff0c;最快的方式就是啃爹。 不管你做什么项目&#xff0c;同行永远都是我们的爹。 跟着爹走&#xff0c;有吃有喝不用愁。 跟着老爹走&#xff0c;蛋花汤里加骨头。 小时候父亲总是把我们高高的举过…

Feign-基于Feign远程调用

目录 一、Feign、RestTemplate对比 二、Feign使用步骤 2.1. 引入依赖 2.2. 在service的启动类添加注解&#xff0c;开启Fergn的功能 2.3. 编写Feign客户端 一、Feign、RestTemplate对比 利用RestTemplate发起远程调用的代码: String url "http://userservice/user/&quo…

CompressAI benchmark经典/传统图像编码器的使用

文章目录 使用简介安装依赖编译安装BPG 使用简介 CompressAI的github仓库中Usage-Evaluation给出了传统编解码器的使用帮助&#xff0c;但是并未给出详细的使用方法。本文旨在进行总结使用方法。下图是传统编解码器相关代码的存放地点&#xff0c;其中codecs为各种编解码器类的…

量子算力引领未来!玻色量子出席第二届CCF量子计算大会

​8月19日至20日&#xff0c;中国计算机学会&#xff08;CCF&#xff09;主办的第二届CCF量子计算大会暨中国量子计算峰会&#xff08;CQCC 2023&#xff09;在中国合肥成功举办。本届大会以“量超融合&#xff0c;大国算力”为主题&#xff0c;设有量子计算软件、硬件、应用生…