我们知道浮点数是无法在计算机中准确表示的,例如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精度不准的问题相关推荐

  1. double java 精度丢失_java中double和float精度丢失问题及解决方法

    在讨论两位double数0.2和0.3相加时,毫无疑问他们相加的结果是0.5.但是问题总是如此吗? 下面我们让下面两个doubles数相加,然后看看输出结果: @Test public void te ...

  2. java强制转换成float_在Java中什么时候double必须强制转换成float 就是要在数值后加f或者强制转换...

    满意答案 auyps 2013.08.05 采纳率:47%    等级:12 已帮助:8409人 好吧,我也来说说double与float之间的转换 首先,我说一下定义时赋值的情况 比如: 你可以这样 ...

  3. java判断float相等_在java中判断两个浮点型(float)数据是否相等的案例

    示例代码: public static void main(String[] args) { float a = 10.222222225f; float b = 10.222222229f; Sys ...

  4. java double long 取值_由一道题引起的思考? java中 long 和double都是64位。为什么double表示的范围大那么多呢?...

    由一道题引起的思考? java中 long 和double都是64位.为什么double表示的范围大那么多呢? 百度标准答案是这样子的: double是n*2^m(n乘以2的m次方)这种形式存储的,只 ...

  5. Java中BigDecimal解决精度丢失问题

    1.我们先看一个例子 可以看到在Java中进行浮点数运算的时候,会出现丢失精度的问题.那么我们如果在进行商品价格计算的时候,就会出现问题.很有可能造成我们手中有0.06元,却无法购买一个0.05元和一 ...

  6. Java double和float精度损失问题

    问题 一般,我们会用float和double来存储有小数的数据,可能还会用两个浮点型数据进行计算,在某些情况下,float和double会出现精度损失,导致存储的数据或者计算结果出现误差. 举个例子 ...

  7. Java中的简单浮点数类型float和double不能够进行精确运算

    在java中,简单的浮点类型float和double是不能够进行运算.我们先看下面的两个程序代码: 代码一: import java.util.Scanner; class Circle { doub ...

  8. java 判断精度_随笔⑦ Java中的比较 ==,equals以及精度对比较的影响

    Java中的比较 ==,equals ① 对于==,如果是作用于基本数据类型的变量,则直接比较其存储的"值"是否相等:如果是作用于引用类型的变量,则比较的是所指向的对象的地址. ② ...

  9. BigDecimal操作double、float精度丢失问题

    一.问题 最近使用BigDecimal进行数值加减运算的时候踩了一个小坑:BigDecimal操作double.float数值时精度丢失. 举个例子: public static void main( ...

最新文章

  1. 悬浮按钮app_分享一款网页转App的神器,绝对值得一用
  2. php 表单处理,用PHP提交from表单的处理方法
  3. HttpClient乱码问题
  4. 初识区块链——用JS构建你自己的区块链
  5. XOR Specia-LIS-t 异或和 贪心
  6. VTK:Filtering之GaussianSplat
  7. Python数据结构学习笔记——栈
  8. java 制作小游戏_如何用java制作小游戏
  9. 【WebRTC---进阶篇】(三)各流媒体服务器的比较
  10. 数据结构(六)查找---多路查找树(2-3-4树)
  11. java arraylist 初始化_一不小心就让Java开发踩坑的fail-fast是个什么鬼?
  12. win10python3.6.3安装_Win10Python3.6安装impyla
  13. Android ADT Templates Android常用模版
  14. librdkafka介绍文档
  15. DrawText如何使多行文字居中
  16. python破解wifi-Python利用字典破解WIFI密码的方法
  17. linux显卡驱动安装在哪个文件夹,linux 下安装Nvidia显卡驱动
  18. python王者战斗_把英雄分类,看 Python 带你上王者
  19. office 论文 页码_word如何设置毕业论文页码
  20. 8-25 26 veriloga语言

热门文章

  1. 三次握手和四次挥手图解_图解TCP三次握手和四次挥手
  2. foreach循环怎么获取全部返回值_JavaScript中For循环的3种版本和使用场景
  3. Java finalize()的使用
  4. 为什么jsp写script代码报错_JSP 报错:ReferenceError: $ is not defined
  5. oracle sql练习_SQL入门学习
  6. java输入输出实验报告_JAVA实验报告(河北工业大学)
  7. java启动时执行_java怎么实现项目启动时执行指定方法
  8. 计算机网络-思维导图(4)网络层
  9. spring 通过EsClientFactory注入elasticsearch
  10. 阿云搭建php博客,阿云的应聘故事