Java—Double类型进行加减乘除出错(精度)问题

news2025/4/19 12:52:17

前言:

我们知道,计算机在计算数据过程中都要先把源代码翻译成二进制的机器码,然后再进行相关的运算。然而在转换的过程中,有些十进制数无法用一个有限的二进制数来表示,就是说转换的时候出现了精度的丢失问题,所以导致最后在运算的过程中,自然就出现了我们出现的精度问题。

整体思路是先将 double 类型的数据转换成 BigDecimal 来进行运算,

目录

一、加法运算        

不做处理时:

 BigDecimal 处理后:

二、减法运算

不做处理时:

 BigDecimal 处理后:

三、乘法运算

不做处理时:

 BigDecimal 处理后:

四、除法运算(Double数相除,并保留scale位小数)

不做处理时:

 BigDecimal 处理后:

五、double与int运算

 不做处理时:

 BigDecimal 处理后:


一、加法运算        

不做处理时:

public static void main(String[] args) {
        double m1=0.1;
        double m2=0.2;
        System.out.println(m1+m2);
    }

运行结果:

 BigDecimal 处理后:

public static void main(String[] args) {
        double m1=0.1;
        double m2=0.2;
        BigDecimal p1 = new BigDecimal(Double.toString(m1));
        BigDecimal p2 = new BigDecimal(Double.toString(m2));
        System.out.println(p1.add(p2).doubleValue());
    }

 运行结果:

二、减法运算

不做处理时:

public static void main(String[] args) {
        double m1=0.11;
        double m2=0.2;
        System.out.println(m2-m1);
    }

运行结果:

 

 BigDecimal 处理后:

public static void main(String[] args) {
        double m1=0.11;
        double m2=0.2;
        BigDecimal p1 = new BigDecimal(Double.toString(m1));
        BigDecimal p2 = new BigDecimal(Double.toString(m2));
        System.out.println(p2.subtract(p1).doubleValue());
    }

 运行结果:

三、乘法运算

不做处理时:

public static void main(String[] args) {
        double m1=0.1;
        double m2=0.2;
        System.out.println(m1*m2);
    }

运行结果:

 

 BigDecimal 处理后:

public static void main(String[] args) {
        double m1=0.1;
        double m2=0.2;
        BigDecimal p1 = new BigDecimal(Double.toString(m1));
        BigDecimal p2 = new BigDecimal(Double.toString(m2));
        System.out.println(p1.multiply(p2).doubleValue());
    }

 运行结果:

四、除法运算(Double数相除,并保留scale位小数)

BigDecimal.ROUND_HALF_UP表示四舍五入,

BigDecimal.ROUND_HALF_DOWN是五舍六入,

BigDecimal.ROUND_UP表示进位处理(就是直接加1),

BigDecimal.ROUND_DOWN表示直接去掉尾数。

不做处理时:

public static void main(String[] args) {
        double m1=0.14;
        double m2=0.3;
        System.out.println(m1/m2);
    }

运行结果:

 

 BigDecimal 处理后:

public static void main(String[] args) {
        double m1=0.14;
        double m2=0.3;
        BigDecimal p1 = new BigDecimal(Double.toString(m1));
        BigDecimal p2 = new BigDecimal(Double.toString(m2));
        //3代表要保留的位数
        System.out.println(p1.divide(p2,3,BigDecimal.ROUND_HALF_UP).doubleValue());
    }

 运行结果:

 

五、double与int运算

 不做处理时:

public static void main(String[] args) {
        int m1=3;
        double m2=0.3;
        System.out.println(m1*m2);
    }

运行结果:

 BigDecimal 处理后:

public static void main(String[] args) {
        int m1=3;
        double m2=0.3;
        BigDecimal p=new BigDecimal(Double.toString(m1));
        BigDecimal n=new BigDecimal(Double.toString(m2));
        System.out.println(p.multiply(n).doubleValue());
    }

 运行结果:

 

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

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

相关文章

模型部署遇到的问题

1.不是有效的Win32应用程序 更改项目中的配置类型: 从网上下载的工程,之前人家是用来封装成库(dll)的,改成exe就好了。 vs学习问题 关于打开程序时不是有效的Win32应用程序_Lay_Nobody的博客-CSDN博客_vs不是有效的wi…

Spring Boot开发之SpringSercurity(续)

Spring Boot开发之SpringSercurity 一、授权1、打开上次项目以及数据库2、有的页面不登录也能访问,比如首页、登录以及注册等,因此对于某些请求不需要登录则放行这些接口(1)修改MySercurityConfig(2)修改TestController类(3)点击运行,在没登录…

数据抓取工具有哪些-数据抓取工具免费推荐的有哪些

随着社会的进步,科技的发展。不管是企业还是个人都清楚地明白了数据的重要性。不仅可以让我们掌握一手资源,同时还能通过数据更清楚竞争对手。同时也告别了手动复制粘贴的痛苦。 企业人员 通过爬取动态网页数据分析客户行为拓展新业务,分析…

java毕业设计健民中医药方网设计(附源码、数据库)

项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis Maven Vue 等等组成,B/…

NC5 二叉树根节点到叶子节点的所有路径和

描述 给定一个二叉树的根节点root,该树的节点值都在数字0−9 之间,每一条从根节点到叶子节点的路径都可以用一个数字表示。 1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点 2.叶子节点是指没有子节点的节点 3.路径只能从父节点到子节点…

java命令中的options

1. Java命令概述 安装JDK时,会使用java -version查看JDK版本,并验证安装是否成功直接输入java,会给出java命令的使用说明 -options:可选,java命令的命令行选项,多个选项使用空格分隔class:要启…

新人一看就懂:Dubbo3 + Nacos的RPC远程调用框架demo

文章目录一、前言Feign和Dubbo到底有啥区别,为啥大厂都爱用RPC框架?二、简介三、dubbo-api(对外暴漏的接口)1、pom依赖2、TestService接口四、dubbo-provider(服务提供者)1、pom依赖2、TestServiceImpl实现…

HCIP-Datacom OSPF进阶(一) 最常用的动态路由协议

目录 OSPF:开放式最短路径优先 OSPF配置方法: OSPF报文头部: OSPF报文类型: OSPF状态机: DR与BDR的作用: 设置选举DR时的优先级: OSPF的网络类型: 修改OSPF接口网络类型命令…

java毕业设计教学平台(附源码、数据库)

项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis Maven Vue 等等组成,B/…

Java实现五子棋小游戏(附源码)

Java进阶学习专栏:【Java】进阶篇 Java基础学习专栏:【Java】基础篇 文章目录一、游戏介绍二、效果展示三、代码展示1、登录页面2、算法程序3、棋盘实现四、资源下载五、文末总结一、游戏介绍 今天给大家分享一个用java写的小游戏——《五子棋》 &#…

计算机毕业设计SSM电影网站系统【附源码数据库】

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【编程题】【Scratch三级】2021.12 数星星

数星星 Goblin有个很厉害的魔法:他一挥手就可以点亮夜空中五彩斑斓的星星灯。 1. 准备工作 (1)删除小猫角色,添加"Goblin"角色,并删除Goblin角色的造型"golblin-a"、“goblin-c"和"goblin-d”,添加角色"Star"; (2)添加“Sta…

Matlab之自适应位移相位中心天线脉冲消除器(附源码)

目录 一、何时使用自适应DPCA脉冲消除器 二、自适应DPCA脉冲消除器可抑制杂波和干扰 三、程序 一、何时使用自适应DPCA脉冲消除器 考虑需要抑制杂波的机载雷达系统 返回并可能干扰干扰。根据以下任何一项 条件下,可以选择自适应 DPCA (ADPCA&#xf…

数据挖掘与分析应用:tableau可视化数据分析,仪表盘,折线图,饼图,条形图,地图,散点图,区域图,表格,数据分析引用

数据挖掘与分析应用:tableau可视化数据分析,仪表盘,折线图,饼图,条形图,地图,散点图,区域图,表格,数据分析引用 2022找工作是学历、能力和运气的超强结合体&…

Java集合

一、集合概述 1、数组的特点 数组的大小是固定的,一旦创建后,数组的大小是无法改变的。数组只能存储相同类型的数据。数组查询效率高(有索引,元素内存连续分配),增删效率低(不断的扩容)。 2、数组和集合的区别 相同点&#xff1…

【Designing ML Systems】第 6 章 :模型开发和离线评估

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

目标检测论文解读复现之三:基于改进YOLOv7的X光图像旋转目标检测

目标检测论文解读复现 文章目录目标检测论文解读复现前言一、摘要二、网络模型及核心创新点三、应用数据集四、实验效果五、实验结论六、投稿期刊介绍前言 此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果…

json字符串、JSNObject、JSONArray、jsonbean、list等相关的转换、过滤工具方法测试

一、准备工作 引入pom <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.78</version> </dependency><dependency><groupId>org.projectlombok</groupId><art…

云计算 - 4 - Spark的安装与应用

云计算 - 4 - Spark的安装与应用目标Spark 的安装&#xff1a;1、下载配置 Scala1.1 下载 Scala1.2 配置 Scala 的路径1.3 测试 Scala 是否安装完成2、下载配置Spark2.1 下载Spark2.2 配置 Spark 的路径2.3 修改 Spark 的配置文件3、将文件复制到子节点4、启动Spark5、测试Spar…

nginx模块

目录 搭建域名虚拟主机 nginx索引 状态索引 访问控制 基于ip限制 基于用户限制 配置nginx官方yum源 http://nginx.org/en/linux_packages.html#RHEL-CentOS vim /etc/yum.repos.d/nginx.repo [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/cent…