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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张小锋 中级黑马   /  2012-4-25 20:50  /  2140 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张小锋 于 2012-4-25 21:04 编辑

public static void main(String[] args)
{
        System.out.println(2.00 - 1.10);

        System.out.println(12345+5432l);

        final long i = 24 * 60 * 60 * 1000 * 1000;//每天的微秒数
        final long m = 24 * 60 * 60 * 1000;//每天的毫秒数
        System.out.println(i/m);

}


打印:
0.8999999999999999
17777
0

真不敢相信这是为什么啊,谁能帮我解释一下好吗?


5 个回复

倒序浏览
本帖最后由 徐晓磊 于 2012-4-25 21:07 编辑
  1. public class Test{
  2.          
  3. public static strictfp void main(String[] args)
  4. {
  5.          System.out.println(2.00 - 1.10);

  6.         System.out.println(12345+5432l);

  7.         final long i = 24 * 60 * 60 * 1000 * 100l;
  8.         final long m = 24 * 60 * 60 * 1000l;
  9.         System.out.println(i/m);

  10. }

  11. }
复制代码
很明显的你没有看过java核心教程这本书
在堆浮点数进行运算的时候,虽然float不管在那个系统平台都是4个字节,但是有些处理器使用80喂浮点寄存器,这些寄存器添加了中间结果的计算精度。
你的程序的第一条输出就是由此引此的,需要在main方法设置strictfp关键字进行标记,执行严格的浮点数运算。
至于第三条输出是因为你赋初值的时候没有加l。

输出截图:

捕获1.PNG (1.31 KB, 下载次数: 42)

捕获1.PNG
回复 使用道具 举报
1.
System.out.println(2.00 - 1.10); //浮点数在计算机中表示一个数字时,并不是一个精确的数,所以使用浮点数时要小心
2.
System.out.println(12345+5432l); //"5432l"的最后一位是小写的"L",不是数字"1",
3.
final long i = 24 * 60 * 60 * 1000 * 100; //int型数最大是: 21亿多,而24 * 60 * 60 * 1000 * 100的结果已经大于21亿,溢出了,实际数据是一个小于24 * 60 * 60 * 1000的数,所以最后除法运算后为0 final long m = 24 * 60 * 60 * 1000;
System.out.println(i/m);

回复 使用道具 举报
1.
System.out.println(2.00 - 1.10); //浮点数在计算机中表示一个数字时,并不是一个精确的数,所以使用浮点数时要小心
2.
System.out.println(12345+5432l); //"5432l"的最后一位是小写的"L",不是数字"1",
3.
final long i = 24 * 60 * 60 * 1000 * 100; //int型数最大是: 21亿多,而24 * 60 * 60 * 1000 * 100的结果已经大于21亿,溢出了,实际数据是一个小于24 * 60 * 60 * 1000的数,所以最后除法运算后为0 final long m = 24 * 60 * 60 * 1000;
System.out.println(i/m);

回复 使用道具 举报
刘基军 发表于 2012-4-25 21:08
1.
System.out.println(2.00 - 1.10); //浮点数在计算机中表示一个数字时,并不是一个精确的数,所以使用浮点 ...

哥们你的1和3回答有问题吧
回复 使用道具 举报
这样写就可以了
        public static void main(String []args)
        {
                System.out.println(2.00f - 1.10f);//2.00和1.10都是小数,后面加个f表示一下就行了,不然会丢失精度

   System.out.println(12345+5432l);//5432后面是L,算出来自然就是17777了
        final long i = 24 * 60 * 60 * 1000 * 1000l;//每天的微秒数算出来的数是long型,后面要加l标示
        final long m = 24 * 60 * 60 * 1000l;//每天的毫秒数算出来的数是long型,后面要加l标示        System.out.println(i/m);



        }
}
这样,,结果就对了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马