黑马程序员技术交流社区

标题: 一个关于Math.floor()的问题。打印结果很奇怪 [打印本页]

作者: 刘源    时间: 2012-7-21 13:19
标题: 一个关于Math.floor()的问题。打印结果很奇怪
本帖最后由 刘源 于 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
这个是打印结果,为什么会是这样啊,应该怎么避免啊,我就是想获得小数。求帮助
作者: 刘源    时间: 2012-7-21 13:38
下面是一个试图解决上述问题的程序,它会打印出什么呢?  
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值的最短表示就是你所看到的打印出来的那个可恶的数字。  
作者: 丁二跃    时间: 2012-7-21 13:44
这好像 是计算机的问题……不能进行精确的小数表示……

曾经:'(竟然用 double 作为 if 条件 判断的条件,理论上 没错 就是不执行,给我郁闷了好久
作者: 柳雷    时间: 2012-7-21 14:11
本帖最后由 柳雷 于 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);
                }
               
}


作者: 陈雷    时间: 2012-7-21 14:32
看晚了.. 技术分木有了..




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