/**

  • 浮点数表示问题
  • @author husky
    */
    public class Change {
    public static void main(String[] args) {
    double num1 = 2.00;
    double num2 = 1.10;
    double num3 = 1.90;
    // 结果:0.8999999999999999
    System.out.println(num1 - num2);
    // 0.10000000000000009
    System.out.println(num1 - num3);
    // 1.0
    System.out.println((num1 - num2) + (num1 - num3));

    System.out.printf("jdk5 printf : %.2f%n",num1 - num2);
    //use BigDecimal(String): 0.90
    //use BigDecimal(Double): 0.899999999999999911182158029987476766109466552734375
    System.out.println("use BigDecimal(String): " + new BigDecimal("2.00").subtract(new BigDecimal("1.10")));
    System.out.println("use BigDecimal(Double): " + new BigDecimal(2.00).subtract(new BigDecimal(1.10)));

    }
    /**

    • 解析:
    • java浮点数表示对于一些小数并不能精确的表示,只能表示成它的临界值;
    • 但是这只是个别的,详细请参考别处
      */

    /**

    • 解决:
    • 获取在使用jdk 5.0之后,通过printf得到的是正确的结果,但是底层的问题依然存在
    • 因此对于涉及需要非常精确的结果,使用浮点数并不合适,尤其是货币运算
    • 方案1:
    • 将运算进行扩大,使用int,long 进行运算,将2美元表示成200美分进行运算
    • 方案2:
    • 使用BigDecimal,但要注意使用BigDecimal(String)构造器,不要使用BigDecimal(Double)
    • 后者与上面的情况类似的
      */
      }

浮点数精确表示,java陷阱的更多相关文章

  1. 第二章 Java浮点数精确计算

    1.实际意义 在实际开发中,如果需要进行float或double的精确计算(尤其是财务计算),直接使用float或double是不行的(具体的例子看下边的代码的main方法的测试结果),需要使用Big ...

  2. Java陷阱之assert关键字

    Java陷阱之assert关键字   一.概述   在C和C++语言中都有assert关键,表示断言. 在Java中,同样也有assert关键字,表示断言,用法和含义都差不多.   二.语法   在J ...

  3. JS/PHP 浮点数精确运算

    php浮点数精确运算 bc是Binary Calculator的缩写.bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(string $left_oper ...

  4. php浮点数精确运算

    php浮点数精确运算 Php: BCMath bc是Binary Calculator的缩写.bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(strin ...

  5. Java陷阱一箩筐----面试题集及解答

    Java陷阱一箩筐----面试题集及解答 面试是没什么道理可讲的,它的题目有的不合情理.脱离实际.有在纸上写的,有当面考你的,也有在电话里问的,给你IDE的估计很少. 当然这些都是Java的基本题,那 ...

  6. Java浮点数精确计算

    BigDecimal是Java提供的一个不变的.任意精度的有符号十进制数对象.

  7. 浮点数运算结果不精确,以及用String来构造BigDecimal进行浮点数精确计算

    1.浮点数运算结果不精确 先看如下代码 System.out.println(1.0 - 0.8); System.out.println(0.2 + 0.1); System.out.println ...

  8. 精确计算java中float和double的精度

    [本文相关的代码放在github上.地址为:https://github.com/VigourJiang/StructuredFloat] Java中double类型的格式基本遵循IEEE 754标准 ...

  9. js浮点数精确计算(加、减、乘、除)

    <SPAN style="FONT-SIZE: 18px">//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加 ...

随机推荐

  1. [LeetCode#212]Word Search II

    Problem: Given a 2D board and a list of words from the dictionary, find all words in the board. Each ...

  2. Robot Framework安装

    Robot Framework(中文站/社交化知识社区,源码)是一款Python编写的通用开源功能测试自动化框架,以作验收测试和验收测试驱动开发(ATDD),它是一种使用表格测试数据语法的关键字驱动的 ...

  3. [Exchange]2个不同域之间互发邮件

    1.互相添加DNS. 不多说,构建信任域也需要这样的 2.DNS中添加Exchange的地址解析. 3.配置Exchange. 在exchange里面添加对方的exchange信息 在Receiver ...

  4. record

    http://www.cnblogs.com/90zeng/p/python_translation.html http://www.cnblogs.com/netfocus/p/4478094.ht ...

  5. linux下swftools 的配置

    1.安装所需的库和组件.机器之前安装过了,主要安装的是下面几个组件.如果不安装会提示machine `x86_64-unknown-linux' not recognized yum install ...

  6. 软中断与硬中断 & 中断抢占 中断嵌套

    参考了这篇文章:http://blog.csdn.net/zhangskd/article/details/21992933 从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通 ...

  7. 11个让你吃惊的Linux终端命令

  8. 快速幂模m算法

    给你三个数,a,b,m 求a^b%m的值. 如果b过大,用普通的快速幂会超时. 所以将b=2^0*b0+2^1*b+b1...... 然后,你们利用初中的知识就知道怎么做了. 继续,上代码. #inc ...

  9. xml学习篇(二) ----JSON 和XML对比

    在比较JSON和XML之前,我们先来上一堂关于数据格式的简要历史(更准确的说,是关于XML的始祖): 早在1970年,IBM开发了一种叫Generalized Markup Language的标记语言 ...

  10. C#类型 分类: C# 2015-03-09 08:44 202人阅读 评论(0) 收藏

    C# 类型 引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又 ...