黑马程序员技术交流社区

标题: java中取小数的问题 [打印本页]

作者: 焦晨光    时间: 2012-7-17 11:21
标题: java中取小数的问题
本帖最后由 焦晨光 于 2012-7-18 08:36 编辑

我是一个java初学者,今天看书在做题的时候遇到一个问题:
import static java.lang.Math.*;

public class Hello
{

public static void main(String[] args)
{
double Num = 1234.5678;
long Num2 = (long)Math.floor(Num);
double Num3 = ((int)(Num*100))/100;
System.out.println(Num3);
}
}

取2位小数,程序输出1234.0,理想输出应该是1234.56,请问什么原因?
作者: 黑马刘涛    时间: 2012-7-17 11:32
本帖最后由 黑马刘涛 于 2012-7-17 11:35 编辑
  1. public class Hello {

  2.         /**
  3.          * @param args
  4.          */
  5.         public static void main(String[] args) {
  6.                 // TODO Auto-generated method stub
  7.                 double Num = 1234.5678;
  8.                 //long Num2 = (long)Math.floor(Num);
  9.                 double Num4 = (int)(Num*100);
  10.                 double Num3 = (double)((int)(Num*100))/100;// double 类型数值与整型数值相除,会保留小数
  11.                 System.out.println(Num4);
  12.                 System.out.println(Num3);

  13.         }

  14. }
复制代码
double Num3 = ((int)(Num*100))/100; //两个整数相除,会发生什么?比如3/2 = 1,((int)(Num*100))/100 = 123456/100 =1234,然后结果转为double类型,Num3 = 1234.0


作者: 孙新强    时间: 2012-7-17 11:56

double Num3 = ((int)(Num*100))/100;
这句话的意思就是:
((int)(Num*100))/100是一个整数 然后把这一个整数  赋值给double类型变量Num3 结果就是1234.0
修改后代码如下:
import static java.lang.Math.*;

public class Hello
{

public static void main(String[] args)
{
double Num = 1234.5678;
long Num2 = (long)Math.floor(Num);
double Num3 = (int)(Num*100);
double Num4=Num3/100;
System.out.println(Num4);
}
}


作者: 王达    时间: 2012-7-17 11:56
本帖最后由 王达 于 2012-7-17 11:59 编辑

import static java.lang.Math.*;

public class Hello
{

public static void main(String[] args)
{
double Num = 1234.5678;
long Num2 = (long)Math.floor(Num); //不知道你的Num2有什么用阿double
Num3 = ((int)(Num*100))/100; //你这里的int把Num*100后的值转成了int型,再除以100后他还默认是int型的。。1234只不过你又给Num3加个类型让最后运行的结果1234变为double而已。
System.out.println(Num3);
}
}

//你可以这么来得到1234.56
public class Hello
{
public static void main(String[] args)
{
double Num = 1234.5678;
long Num2 = (long)(Num*100);
System.out.println(Num2);
double Num3 = (double)Num2/100;
System.out.println(Num3);
}  
}

作者: 韩伟    时间: 2012-7-17 11:57
这个过程是这样的
首先,(Num*100)得到一个double型的数12345.67
然后,执行(int)(12345.67)就是强制把double转换成 int 型 结果为12345
之后就是连个整形相除 即123456/100,结果依然是一个int型数 1234
最后就是把一个int型的数负值给一个double行的变量,那么那么系统会在int型数后加 .0
于是就得到最后的结果 1234.0

作者: 樊佰轩    时间: 2012-7-17 12:19
double Num3 = ((int)(Num*100))/100;
这一句话应该改为如下:
double Num3 = ((double)(int)(Num*100))/100;
解释:
Num=1234.5678 --double类型
Num*100=123456.78 --double类型
(int)(Num*100)=123456 --int类型
(int)(Num*100)/100=1234 -- int类型
当它强转成double时为1234.0

而修改为上述时,指在它除100前先转成double
(double)(int)(Num*100)=123456.0 --double类型
此时除100
((double)(int)(Num*100))/100=1234.56 -- double类型
作者: 陈少文    时间: 2012-7-18 08:26
本帖最后由 陈少文 于 2012-7-18 08:30 编辑

用函数NumberFormat解决

在一般的要求中,需要四舍五入
import java.text.NumberFormat;

public class RegexDemo
{
        
        public static void main(String args[])
        {
                double Num = 1234.5678;

                //NumberFormat 是所有数字格式的抽象基类
                NumberFormat ddf1 = NumberFormat.getInstance();
               
                // 设置数的小数部分的最大位数。
                ddf1.setMaximumFractionDigits(2);
               
                String s = ddf1.format(Num);
                System.out.print(s);
        }
}








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