Java中如何解决double和float精度不准的问题
我们知道浮点数是无法在计算机中准确表示的,例如0.1在计算机中只是表示成了一个近似值,因此,对付点数的运算时结果具有不可预知性。
在进行数字运算时,如果有double或float类型的浮点数参与计算,偶尔会出现计算不准确的情况。如以下示例代码:
package ex;public class BigDeciTest {public static void main(String[] args){System.out.println(0.05+0.01);System.out.println(1.0-0.42);System.out.println(4.015*100);System.out.println(123.3/100);}}
上述代码执行结果如下:
0.060000000000000005 0.5800000000000001 401.49999999999994 1.2329999999999999
在大多数情况下,使用double和float计算的结果是准确的,但是在一些精度要求很高的系统中,这种问题是非常严重的。
在《Effective Java》中提到一个原则,那就是float和double只能用来作科学计算或者是工程计算,但在商业计算中我们要用java.math.BigDecimal,通过使用BigDecimal类我们可以解决上述问题,实例代码如下:
package ex;import java.math.*;public class BigDecimalDemo {public static void main(String[] args){System.out.println(ArithUtil.add(0.01, 0.05));System.out.println(ArithUtil.sub(1.0, 0.42));System.out.println(ArithUtil.mul(4.015, 100));System.out.println(ArithUtil.div(123.3, 100));} }class ArithUtil{private static final int DEF_DIV_SCALE=10;private ArithUtil(){}public static double add(double d1,double d2){BigDecimal b1=new BigDecimal(Double.toString(d1));BigDecimal b2=new BigDecimal(Double.toString(d2));return b1.add(b2).doubleValue();}public static double sub(double d1,double d2){BigDecimal b1=new BigDecimal(Double.toString(d1));BigDecimal b2=new BigDecimal(Double.toString(d2));return b1.subtract(b2).doubleValue();}public static double mul(double d1,double d2){BigDecimal b1=new BigDecimal(Double.toString(d1));BigDecimal b2=new BigDecimal(Double.toString(d2));return b1.multiply(b2).doubleValue();}public static double div(double d1,double d2){return div(d1,d2,DEF_DIV_SCALE);}public static double div(double d1,double d2,int scale){if(scale<0){throw new IllegalArgumentException("The scale must be a positive integer or zero");}BigDecimal b1=new BigDecimal(Double.toString(d1));BigDecimal b2=new BigDecimal(Double.toString(d2));return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();}}
运行结果如下:
0.06 0.58 401.5 1.233
详细,请参考API文档。
转载于:https://www.cnblogs.com/zenghansen/p/3990311.html
Java中如何解决double和float精度不准的问题相关推荐
- double java 精度丢失_java中double和float精度丢失问题及解决方法
在讨论两位double数0.2和0.3相加时,毫无疑问他们相加的结果是0.5.但是问题总是如此吗? 下面我们让下面两个doubles数相加,然后看看输出结果: @Test public void te ...
- java强制转换成float_在Java中什么时候double必须强制转换成float 就是要在数值后加f或者强制转换...
满意答案 auyps 2013.08.05 采纳率:47% 等级:12 已帮助:8409人 好吧,我也来说说double与float之间的转换 首先,我说一下定义时赋值的情况 比如: 你可以这样 ...
- java判断float相等_在java中判断两个浮点型(float)数据是否相等的案例
示例代码: public static void main(String[] args) { float a = 10.222222225f; float b = 10.222222229f; Sys ...
- java double long 取值_由一道题引起的思考? java中 long 和double都是64位。为什么double表示的范围大那么多呢?...
由一道题引起的思考? java中 long 和double都是64位.为什么double表示的范围大那么多呢? 百度标准答案是这样子的: double是n*2^m(n乘以2的m次方)这种形式存储的,只 ...
- Java中BigDecimal解决精度丢失问题
1.我们先看一个例子 可以看到在Java中进行浮点数运算的时候,会出现丢失精度的问题.那么我们如果在进行商品价格计算的时候,就会出现问题.很有可能造成我们手中有0.06元,却无法购买一个0.05元和一 ...
- Java double和float精度损失问题
问题 一般,我们会用float和double来存储有小数的数据,可能还会用两个浮点型数据进行计算,在某些情况下,float和double会出现精度损失,导致存储的数据或者计算结果出现误差. 举个例子 ...
- Java中的简单浮点数类型float和double不能够进行精确运算
在java中,简单的浮点类型float和double是不能够进行运算.我们先看下面的两个程序代码: 代码一: import java.util.Scanner; class Circle { doub ...
- java 判断精度_随笔⑦ Java中的比较 ==,equals以及精度对比较的影响
Java中的比较 ==,equals ① 对于==,如果是作用于基本数据类型的变量,则直接比较其存储的"值"是否相等:如果是作用于引用类型的变量,则比较的是所指向的对象的地址. ② ...
- BigDecimal操作double、float精度丢失问题
一.问题 最近使用BigDecimal进行数值加减运算的时候踩了一个小坑:BigDecimal操作double.float数值时精度丢失. 举个例子: public static void main( ...
最新文章
- 悬浮按钮app_分享一款网页转App的神器,绝对值得一用
- php 表单处理,用PHP提交from表单的处理方法
- HttpClient乱码问题
- 初识区块链——用JS构建你自己的区块链
- XOR Specia-LIS-t 异或和 贪心
- VTK:Filtering之GaussianSplat
- Python数据结构学习笔记——栈
- java 制作小游戏_如何用java制作小游戏
- 【WebRTC---进阶篇】(三)各流媒体服务器的比较
- 数据结构(六)查找---多路查找树(2-3-4树)
- java arraylist 初始化_一不小心就让Java开发踩坑的fail-fast是个什么鬼?
- win10python3.6.3安装_Win10Python3.6安装impyla
- Android ADT Templates Android常用模版
- librdkafka介绍文档
- DrawText如何使多行文字居中
- python破解wifi-Python利用字典破解WIFI密码的方法
- linux显卡驱动安装在哪个文件夹,linux 下安装Nvidia显卡驱动
- python王者战斗_把英雄分类,看 Python 带你上王者
- office 论文 页码_word如何设置毕业论文页码
- 8-25 26 veriloga语言
热门文章
- 三次握手和四次挥手图解_图解TCP三次握手和四次挥手
- foreach循环怎么获取全部返回值_JavaScript中For循环的3种版本和使用场景
- Java finalize()的使用
- 为什么jsp写script代码报错_JSP 报错:ReferenceError: $ is not defined
- oracle sql练习_SQL入门学习
- java输入输出实验报告_JAVA实验报告(河北工业大学)
- java启动时执行_java怎么实现项目启动时执行指定方法
- 计算机网络-思维导图(4)网络层
- spring 通过EsClientFactory注入elasticsearch
- 阿云搭建php博客,阿云的应聘故事