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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 刘源 于 2012-7-21 14:54 编辑

class LX
{
        public static void main(String[] args)
        {
                double d =34.1;
                math(d);
        }
        public static void math(double d)
        {
                double c=Math.floor(d);
                double f = d - c;
                System.out.println(d);
                System.out.println(c);
                System.out.println(f);
                }
               
}
这个是程序。
34.1
34.0
0.10000000000000142
这个是打印结果,为什么会是这样啊,应该怎么避免啊,我就是想获得小数。求帮助

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
下面是一个试图解决上述问题的程序,它会打印出什么呢?  
public class Change{
public static void main(String args[]){
System.out.println(2.00 - 1.10);
}
}
你可能会很天真地期望该程序能够打印出0.90,但是它如何才能知道你想要打印小数点后两位小数呢?  
如 果你对在Double.toString文档中所设定的将double类型的值转换为字符串的规则有所了解,你就会知道该程序打印出来的小数,是足以将 double类型的值与最靠近它的临近值区分出来的最短的小数,它在小数点之前和之后都至少有一位。因此,看起来,该程序应该打印0.9是合理的。  
这么分析可能显得很合理,但是并不正确。如果你运行该程序,你就会发现它打印的是0.8999999999999999。  
问 题在于1.1这个数字不能被精确表示成为一个double,因此它被表示成为最接近它的double值。该程序从2中减去的就是这个值。遗憾的是,这个计 算的结果并不是最接近0.9的double值。表示结果的double值的最短表示就是你所看到的打印出来的那个可恶的数字。  
回复 使用道具 举报
这好像 是计算机的问题……不能进行精确的小数表示……

曾经:'(竟然用 double 作为 if 条件 判断的条件,理论上 没错 就是不执行,给我郁闷了好久
回复 使用道具 举报
本帖最后由 柳雷 于 2012-7-21 14:14 编辑


显示不对是精度问题。
class LX{
        public static void main(String[] args)
        {
                double d =34.1;
                math(d);
        }
        public static void math(double d)
        {
                double c=Math.floor(d);
                float f = (float) (d - c);//强制转换类型就好了                System.out.println(d);
                System.out.println(c);
                System.out.println(f);
                }
               
}

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
看晚了.. 技术分木有了..

点评

回答的比上面的同学还要的好,还是有技术分的!  发表于 2012-7-21 14:42
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马