A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lingdu 中级黑马   /  2015-4-26 13:07  /  638 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

JAVA的浮点运算
1、一道简单的计算题


class Test
{
    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

为什么会是这样的数值?再看一个代码


class Test1
{
    public static void main(String[] args)
    {
        System.out.printf("%1.20f\n",0.05f);
        System.out.printf("%1.20f\n",0.01f);
        System.out.printf("%1.20f\n",1.0f);
        System.out.printf("%1.20f\n",0.42f);
        System.out.printf("%1.20f\n",123.3f);
    }
}看上面的代码运行的结果:

0.05000000074505806000
0.00999999977648258200
1.00000000000000000000
0.41999998688697815000
123.30000305175781000000

这是float在计算机上面的表示的。

java中的float和double,采用IEEE754标准,实际上是用利用科学计数法来表达实数。即用一个尾数(Mantissa也叫有效数字 ),一个基数(Base),一个指数(Exponent)以及
一个表示正负的符号来表达实数。实数表示分为三个域。
float用32bit存储,double用64bit存储。
第一个域为符号域,0 表示数值为正数,而 1 则表示负数;
第二个域为指数域,对应于我们之前介绍的二进制科学计数法中的指数部分。其中单精度数为 8 位,双精度数为 11 位。float单精度的指数范围为-127 和 127 之间。
第三个域为尾数域,其中单精度数为 23 位长,双精度数为 52 位长。
造成无法准确的计算出来我们想要的结果,原因是科学计算法无法准确的存储,只有相近的取近似值

所以我们对于精确的计算采用的是BigDecimal类可以解决上面的问题。

10 个回复

倒序浏览
很好  顶一个  
回复 使用道具 举报
66666666666
回复 使用道具 举报
嗯嗯,受教了
回复 使用道具 举报
一直弄不明白,现在有点明白了。
回复 使用道具 举报
学习了......
回复 使用道具 举报
知道这么回事,没大看懂
回复 使用道具 举报
受益匪浅啊
回复 使用道具 举报
张乐 中级黑马 2015-4-26 22:23:41
9#
感谢楼主分享!很长姿势哦!
回复 使用道具 举报
感觉很强大!!!
回复 使用道具 举报
感谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马