double operator[](int i)_java中double类型精度丢失问题及解决方法

原文链接:https://blog.csdn.net/yacolspace/article/details/78287394

double类型数据加减操作精度丢失问题

今天在项目中用到double类型数据加减运算时,遇到了一个奇怪的问题,比如1+20.2+300.03,理论上结果应该是321.23,其实结果并不是这样。

public double add() {        double number1 = 1;        double number2 = 20.2;        double number3 = 300.03;        double result = number1 + number2 + number3;        System.out.println(result);        return result;    }

打印结果如下:

c19adee540a7680cb1f979fe55999ca0.png

这是为什么呢?又该如何解决呢?

在使用Java中double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1。float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。BigDecimal一共有4个够造方法,我们只考虑两个进行比较,分别是

BigDecimal(double val)          Translates a double into a BigDecimal.BigDecimal(String val)          Translates the String repre sentation of a BigDecimal into a BigDecimal.

上面的API简要描述相当的明确,而且通常情况下,上面的那一个使用起来要方便一些。我们可能想都不想就用上了,会有什么问题呢?

现贴出BigDecimal的一个构造函数的文档供大家参考

23c4daa808191894ffc0c41e1f4ac724.png

解决方法

相信从上面的文档大家也已经找出了解决方法,在需要精确的表示两位小数时我们需要把他们转换为BigDecimal对象,然后再进行运算。

另外需要注意,使用BigDecimal(double val)构造函数时仍会存在精度丢失问题,建议使用BigDecimal(String val)。这就需要先把double转换为字符串然后在作为BigDecimal(String val)构造函数的参数。转换为BigDecimal对象之后再进行加减乘除操作,这样精度就不会出现问题了。这也是为什么有关金钱数据存储都使用BigDecimal。

处理double类型数据的加、减、乘、除运算时,使用如下方法:

/**     * 加法运算     * @param m1     * @param m2     * @return     */    public static double addDouble(double m1, double m2) {        BigDecimal p1 = new BigDecimal(Double.toString(m1));        BigDecimal p2 = new BigDecimal(Double.toString(m2));        return p1.add(p2).doubleValue();    }    /**     * 减法运算     * @param m1     * @param m2     * @return     */    public static double subDouble(double m1, double m2) {        BigDecimal p1 = new BigDecimal(Double.toString(m1));        BigDecimal p2 = new BigDecimal(Double.toString(m2));        return p1.subtract(p2).doubleValue();    }    /**     * 乘法运算     * @param m1     * @param m2     * @return     */    public static double mul(double m1, double m2) {        BigDecimal p1 = new BigDecimal(Double.toString(m1));        BigDecimal p2 = new BigDecimal(Double.toString(m2));        return p1.multiply(p2).doubleValue();    }    /**     * 除法运算     * @param   m1     * @param   m2     * @param   scale     * @return     */    public static double div(double m1, double m2, int scale) {        if (scale 

验证文章开头提到的问题是否解决,

public double addDouble() {        double result1 = add(1, 20.2);        double result2 = add(result1, 300.03);        System.out.println("使用BigDecimal时结果值:" + result2);        return result2;    }

打印结果值

e32b10fa68675c8d0dcb3e529fdf1970.png

跟预想中的结果值一样,解决了double类型数据加减操作时精度丢失的问题。

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

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

相关文章

验证客户端和服务端可以传输经SM4加密的密文数据,从而验证发送数据已使用服务器密码机进行SM4加密,而不是随便的字符串乱码

前提操作 搭建客户端和服务端 Socket代码实现服务端 和 客户端之间通信_CHYabc123456hh的博客-CSDN博客使用wireshark进行数据的监听和测试https://blog.csdn.net/CHYabc123456hh/article/details/121929288 结论验证 使用在线SM4加密,输入明文 和 选择模式,生成…

Socket编程 涵盖代码和函数参数介绍

Socket是针对端系统,也就是用户主机上开发程序,不涉及网络设备(交换机、路由器)独立于网卡驱动层之上,不涉及硬件,即基于Packet Driver编程端:是指通信双方两台电脑 应用编程接口API 也就是两端 应用层内部的应用进程之…

springcloud阿里巴巴五大组件_如何无缝迁移 SpringCloud/Dubbo 应用到 Serverless 架构

简介: 本文分为三部分来介绍,分别介绍微服务应用迁移到 SAE 的优势,如何迁移 SpringCloud/Dubbo 应用到 SAE 上,以及针对 SpringCloud 应用迁移的实践演示。背景通过前面几节课程的学习,相信大家对于 SAE 平台已经有了…

pythonnone用法_python中None返回值如何使用?

None是python中的特殊存在。作为函数,在用到返回值的经常使用。今天小编就来讲讲None作为函数返回值时,会出现的三种情况。 一、作为操作类函数的默认返回值 当某个操作类函数不需要任何返回值时,通常就会返回 None。同时,None 也…

C++ Byte转十六进制字符串输出

代码 例子一 typedef std::vector<unsigned char> bytes; std::string BytesToStr(const bytes& in) {bytes::const_iterator from in.cbegin();bytes::const_iterator to in.cend();std::ostringstream oss;for (; from ! to; from)oss << std::hex <&…

frame中src怎么设置成一个变量_Go 语言设计哲学之七:变量声明须一致

Go 语言&#xff0c;使用变量之前需要先进行变量的声明。var s string “Golang"n : 666Go 语言有两类变量包级别(package varible)&#xff1a;在 package 级别可见的变量。如果是导出变量&#xff0c;该变量也可以被视为全局变量&#xff1b;局部变量(local varible)&a…

数据填充规则之PKCS7

程序输入的数据全部使用Hex 十六进制的格式 IV 00000000000000000000000000000000Source(加密数据) char input_date[] {a,a,a,a,.......} Ascll编码 需要转16进制input_data 303030303030303030303030303030CC CC表示此位无数据注意事项&#xff1a;考虑到程序采用 PKCS…

getdevicecaps在哪个头文件里_一招定胜负,while (true) 和 for (;;) 到底哪个更快

在JDK8u的jdk项目下做个很粗略的搜索&#xff1a;mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "for (s?;s?;" . | wc -l 369mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "while (true" . | wc -l 323并没有差多少。其次&#…

SM4 ECB加密模式 数据对比试验论证

程序如下 开启服务器密码机&#xff0c;调用SM4加密函数&#xff0c;需要注意的是程序输入的数据全部使用Hex 十六进制的格式 Key IV Data IV 00000000000000000000000000000000Source(加密数据) char input_date[] {a,a,a,a,.......} Ascll编码 需要转16进制input_data …

二分法查找c语言程序_C语言的那些经典程序 第十四期

戳“在看”一起来充电吧!C语言的那些经典程序 第十四期本期小C给大家带来三个用C语言解决实际问题的典例。如果全都理解&#xff0c;相信肯定能给大家带来收获&#xff01;接下来让我们看看是哪些程序吧&#xff01;1字符查找源程序&#xff1a;运行结果&#xff1a;程序分析:该…

C++ puts函数 打印字符串很方便

参考链接 c puts函数_在C / C 中使用puts&#xff08;&#xff09;函数_从零开始的教程世界-CSDN博客

centos网络隔一段时间就断_计算机网络总结

POST跟GET的区别作用GET用于获取资源&#xff0c;而POST用于传输实体参数GET的参数以字符串的格式出现在URL中&#xff0c;而POST的参数存储在请求实体中。因为URL只支持ASCII码&#xff0c;故GET的参数如果存在中文等字符就需要先进行编码&#xff0c;POST参考支持标准字符集。…

C++/C++11中std::runtime_error的使用

参考链接 C/C11中std::runtime_error的使用_网络资源是无限的-CSDN博客_runtimeerror

有python基础学java_Python基础学习篇

导读Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。Python由Guido van Rossum于1989年底发明&#xff0c;第一个公开发行版发行于1991年。像Perl语言一样, Python 源代码同样遵循 GPL(GNU General Public License)协议。一. 列表1.1 列表的介绍列表是python的…

使用wireshark抓包,本地环回测试通信数据已经通过SM4国密算法加密

具体操作 本实验采用 本地环回测试开启wireshark抓包工具&#xff0c;设定端口号 tcp.port 5099 &#xff08;5099为服务端对外开启服务的端口号&#xff09;&#xff0c;不可以使用ip.addr指定ip地址&#xff0c;因为本地环回测试&#xff0c;相关信息太多&#xff0c;使用端…

public 函数_UE4精品教程 | 渲染编程(C++篇)【第三卷:从仿函数到std::function再到虚幻4Delegate】...

本文转载于YivanLee知乎作者专题目录链接&#xff1a;https://zhuanlan.zhihu.com/p/67694999这几天研究了一下虚幻4的delegate&#xff0c;但是想要理解这个&#xff0c;还得从仿函数说起。下面是一段代码例子&#xff1a;class MyFunctor{ public: int operator()(int …

C语言深度剖析书籍学习记录 第一章 关键字

C语言标准定义了32个关键字 union声明联合数据类型 Union declaration - cppreference.com维护足够的空间来置放多个数据成员中的“一种”&#xff0c;而不是为每一个数据成员配置空间&#xff0c;在 union 中所有的数据成员共用一个空间&#xff0c;同一时间只能储存其中一个…

js页面自适应屏幕大小_移动端自适应布局方法的calc()与vw

前端人员在处理移动端自适应布局时&#xff0c;目前前端最流行的方法应该就是使用媒体查询&#xff0c;来设置HTML的字体大小&#xff0c;然后用rem为单位对Dom的宽高进行设置&#xff0c;这个方法的优势在于兼容性方面很好&#xff0c;劣势则在于当前市场上不同的机型太多&…

C语言深度剖析书籍学习记录 第二章 符号

\ 连接符号&#xff0c;// \ 可以把下一行也注释调编译器 删除注释时&#xff0c;会使用空格进行替代