黑马程序员技术交流社区

标题: Math对象 [打印本页]

作者: 睡不够的猪    时间: 2013-10-2 15:21
标题: Math对象
本帖最后由 睡不够的猪 于 2013-10-2 19:01 编辑

/*
需求:给定一个小数 保留小数的后两位
思路:
  将给定的小数乘以100 取四舍五入的值,然后将得到的值除以100即可。
*/
  1. class MathDemo
  2. {
  3. public static void main(String[] args)
  4. {
  5. getNum(5.87965);
  6. getNum(5.45248);

  7. }
  8. public static void getNum(double d)
  9. {
  10. long i=Math.round(d*100);
  11. d=i/100;
  12. System.out.println(i);
  13. System.out.println(d);
  14. }
  15. }
复制代码
为什么打印出来的结果是588    5.0   545     5.0  而不是588    5.88  545    5.45 呢
请问到底是哪里出现了问题 ? 应该怎么做呢 ? 谢谢!


作者: 王靖远    时间: 2013-10-2 16:05
long型除以int型结果是long型。 会被去掉小数点后的数,然后赋值给你的double型。应该是这样导致的错误。
作者: 王靖远    时间: 2013-10-2 16:07
这题可以先将小数转成字符串,然后再操作。
作者: Simple_love    时间: 2013-10-2 16:09
问题出现在d=i/100,虽然你返回的是double类型, 但是程序在运行时,会把小数的部分舍弃,保留整数部分,所有运行的结果为5.0
作者: 陈钦涛    时间: 2013-10-2 17:51
d*100的时候是587.965(d是double类型,跟int类型100计算,100被提升为double类型100.0,计算后是的值是587.965)。接着被round后的double值588.0用long类型变量接收,被转换成了588,就是i的值啦。long类型的i再除以int类型的100,值就是long类型的5,但是是被double类型的d所引用,又被转型成double啦,所以,5就又成了double类型,后面加了小数点,即5.0。后面的那个同理,希望能帮到你
作者: 睡不够的猪    时间: 2013-10-2 18:54
陈钦涛 发表于 2013-10-2 17:51
d*100的时候是587.965(d是double类型,跟int类型100计算,100被提升为double类型100.0,计算后是的值是587 ...

明白了 很给力的解答  谢谢!
作者: 蔚蓝天色    时间: 2013-10-2 21:16
在Java中小数默认为double类型的,
第一个数:d*100=587.9对吧?
然后Math.round()的运算规则是Math.round(x+0.5)然后向下取整,所以也就是587.9+05=588.4 等于588
d=i/100;
首先i是long类型的,100是int类型的,所以当不同类型的运算语句出现在Java中时,JVM会自动将较小的类型升到同类型的,也就是说100也是long型的,
那么d是long类型的,double(16个字节)大于long(8个字节)所以d=5.0
其他的下面就是一样的了,希望能帮到你




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