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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 睡不够的猪 中级黑马   /  2013-10-2 15:21  /  1506 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 睡不够的猪 于 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 呢
请问到底是哪里出现了问题 ? 应该怎么做呢 ? 谢谢!

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

6 个回复

正序浏览
在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
其他的下面就是一样的了,希望能帮到你

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
陈钦涛 发表于 2013-10-2 17:51
d*100的时候是587.965(d是double类型,跟int类型100计算,100被提升为double类型100.0,计算后是的值是587 ...

明白了 很给力的解答  谢谢!
回复 使用道具 举报
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。后面的那个同理,希望能帮到你

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
问题出现在d=i/100,虽然你返回的是double类型, 但是程序在运行时,会把小数的部分舍弃,保留整数部分,所有运行的结果为5.0

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
这题可以先将小数转成字符串,然后再操作。
回复 使用道具 举报
long型除以int型结果是long型。 会被去掉小数点后的数,然后赋值给你的double型。应该是这样导致的错误。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马