黑马程序员技术交流社区

标题: 关于精度问题. [打印本页]

作者: tc4892998    时间: 2014-5-6 21:31
标题: 关于精度问题.
我是一名JAVA新手.今天我在学INT,FLOAT,DOUBLE这些变量类型.
但是发现了个事儿,代码如下:
class Sum01
{
        public static void main(String[] args)
        {
                double a=1.222;
                int b=3;
                double c=a+b;
                System.out.println("c="+c);

        }

}


期望的结果为c=4.222,但是在CMD里运行的结果为c=4.22200002861023.
请教各位高手,这是为什么?
作者: 曹冬明    时间: 2014-5-6 22:08
因为Java里你直接写出来的小数都是double的,占八个字节,如果你想让他是float的,必须在小数后面加个f也就是1.222f。浮点数在内存中存储的都是一个近似值,他的存储方式是第一位为符号位,2-11位是指数位,后面的才是尾数部分,你这个是int与double相加,int会被提升,后面加一堆0,也不一定是0,什么都有,就是近似值,所以结果会是那么长
作者: 创造命运    时间: 2014-5-6 22:27
我知道原因,但是我也不知道该怎么回答你。给你一个网址吧:http://www.cnblogs.com/fromchaos/archive/2010/12/07/1898698.html
作者: 心?=忐§忑]    时间: 2014-5-6 22:32
  1. public class Sum1 {

  2.                 public static void main(String[] args)
  3.                 {
  4.                         double a=1.222;
  5.                         int b=3;
  6.                         double c=a+b;
  7.                         System.out.printf("%.3f",c);

  8.                 }

  9.         }
复制代码

作者: tc4892998    时间: 2014-5-7 10:09
心?=忐§忑] 发表于 2014-5-6 22:32

你这段代码是控制输出位数吧?
作者: tc4892998    时间: 2014-5-7 10:10
曹冬明 发表于 2014-5-6 22:08
因为Java里你直接写出来的小数都是double的,占八个字节,如果你想让他是float的,必须在小数后面加个f也就 ...

谢谢.这就类似于EXCEL里的通过计算获得的数值,如果复制到别的地方,仅复制数值,其后也有很多小数的原理一样吧?
作者: 心?=忐§忑]    时间: 2014-5-7 22:47
恩,就是的这样的奥。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2