问题:

  对两个double类型的值进行运算,有时会出现结果值异常的问题。比如:

     System.out.println(19.99+20);
System.out.println(1.0-0.66);
System.out.println(0.033*100);
System.out.println(12.3/100);

输出:

39.989999999999995
0.33999999999999997
3.3000000000000003
0.12300000000000001

解决方法:

  Java中的简单浮点数类型float和double不能够进行运算,因为大多数情况下是正常的,但是偶尔会出现如上所示的问题。这个问题其实不是JAVA的bug,因为计算机本身是二进制的,而浮点数实际上只是个近似值,所以从二进制转化为十进制浮点数时,精度容易丢失,导致精度下降。

  要保证精度就要使用BigDecimal类,而且不能直接从double直接转BigDecimal,要将double转string再转BigDecimal。也就是不能使用BigDecimal(double val) 方法,你会发现没有效果。要使用BigDecimal(String val) 方法。具体例子如下所示。

double类型四则运算例子:

1、相加

     public static double add(double a1, double b1) {
BigDecimal a2 = new BigDecimal(Double.toString(a1));
BigDecimal b2 = new BigDecimal(Double.toString(b1));
return a2.add(b2).doubleValue();
}

2、相减

     public static double sub(double a1, double b1) {
BigDecimal a2 = new BigDecimal(Double.toString(a1));
BigDecimal b2 = new BigDecimal(Double.toString(b1));
return a2.subtract(b2).doubleValue();
}

3、相乘

     public static double mul(double a1, double b1) {
BigDecimal a2 = new BigDecimal(Double.toString(a1));
BigDecimal b2 = new BigDecimal(Double.toString(b1));
return a2.multiply(b2).doubleValue();
}

4、相除

     public static double div(double a1, double b1, int scale) {
if (scale < 0) {
throw new IllegalArgumentException("error");
}
BigDecimal a2 = new BigDecimal(Double.toString(a1));
BigDecimal b2 = new BigDecimal(Double.toString(b1));
return a2.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}

scale参数为除不尽时,指定精度。

JAVA中double类型运算结果异常的解决的更多相关文章

  1. Java中double类型的数据精确到小数点后两位

    Java中double类型的数据精确到小数点后两位 多余位四舍五入,四种方法 一: double f = 111231.5585;BigDecimal b = new BigDecimal(f); d ...

  2. 关于java中Double类型的运算精度问题

    标题     在Java中实现浮点数的精确计算    AYellow(原作) 修改    关键字     Java 浮点数 精确计算   问题的提出:如果我们编译运行下面这个程序会看到什么?publi ...

  3. 关于java中Double类型的运算精度问题(转)

    Java Java double:浮点数:精确计算  public class Test{    public static void main(String args[]){        Syst ...

  4. Java中Double类型计算问题

    public class Test{    public static void main(String args[]){        System.out.println(0.05+0.01);  ...

  5. 如何使java中double类型不以科学计数法表示

    在java中,把一个double或者BigDecimal的小数转换为字符串时,经常会用科学计数法表示,而我们一般不想使用科学计数法,可以通过:DecimalFormat a = new Decimal ...

  6. java中double类型显示两个小数,比如12.00

    Double类型的数据如何保留两位小数? 各位大虾,现有Double类型的数据,如何转换为保留两位小数的数,返回值的类型仍然是Double类型的,而不是字符串类型. 比如     0,返回“0.00” ...

  7. Java中double类型数据的精度问题

    今天在写段代码模拟计算器的时候,偶然发现,当我进行小数运算的时候,竟然出现了令我惊讶的结果,后来问了问度娘,才晓得,原来这里面还有点知识呢,下面是介绍: 你猜下面几句的结果是多少? public cl ...

  8. Java中Double类型的精确计算

    import java.math.BigDecimal; public class DoubleUtil { private static final int DEF_DIV_SCALE = 5; / ...

  9. Java中Double类型数据比较大小

    方法一:转成字符串之后比较 如果要比较的两个double数据的字符串精度相等,可以将数据转换成string然后借助string的equals方法来间接实现比较两个double数据是否相等.注意这种方法 ...

随机推荐

  1. PE解析器的编写(三)——区块表的解析

    PE文件中所有节的属性都被定义在节表中,节表由一系列的IMAGE_SECTION_HEADER结构排列而成,每个结构用来描述一个节,结构的排列顺序和它们描述的节在文件中的排列顺序是一致的. 具有相同属 ...

  2. ABAP开发人员未来应该学些什么

    2007年1月我大学毕业进入SAP Chengdu从事开发工作,到今天已经整整11年了. 这张图在ABAP开发圈子里曾广为流传: 为了避免这种窘境发生在ABAPer身上,我们应该做点什么呢? 2017 ...

  3. while循环写3次用户名密码验证程序

    #变量来自原始用户名和密码 username = 'admin' password = 'nimda' #变量来自计数器 count = 0 #循环条件计数器小于3,则执行while代码块 while ...

  4. Chris Richardson微服务翻译:构建微服务之使用API网关

    Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关(本文) 构建微服务之微服务架构的进程通讯 微服务架构中的服务发现 微服务之事件驱动的数据管理 微服 ...

  5. IDEA新建spring boot项目没有Spring Initializr选项

    在settings -> Plugins 里面搜索spring boot,勾选上,然后再重启下idea,就可以了.如果Plugins里面没有spring boot的话,先安装下,再勾选. 参考( ...

  6. Keepalived实战(3)

    一.环境 如上图所示: keepalived的mater为proxy-master,keepalived的slave为proxy-slave. 要求:当mater出现问题时,主动切换到slave上.这 ...

  7. jdbc+servlet+jsp实现登录验证

    基础知识准备:sql的增删改查. 新增:insert into 表名称(字段名.....)values(字段名....). 修改:update 表名称 set  字段名="新值" ...

  8. Grails框架使用指南

    Grails框架使用指南,详解Grails框架!cnxieyang@163.com

  9. 使用python写天气预告

    先去YY天气注册一个账号,然后就能用API了 http://www.yytianqi.com/ # encoding=utf-8import urllib.requestimport jsonimpo ...

  10. UVA - 12050-Palindrome Numbers

    12050 - Palindrome Numbers Time limit: 3.000 seconds A palindrome is a word, number, or phrase that ...