黑马程序员技术交流社区
标题:
Math对象
[打印本页]
作者:
睡不够的猪
时间:
2013-10-2 15:21
标题:
Math对象
本帖最后由 睡不够的猪 于 2013-10-2 19:01 编辑
/*
需求:给定一个小数 保留小数的后两位
思路:
将给定的小数乘以100 取四舍五入的值,然后将得到的值除以100即可。
*/
class MathDemo
{
public static void main(String[] args)
{
getNum(5.87965);
getNum(5.45248);
}
public static void getNum(double d)
{
long i=Math.round(d*100);
d=i/100;
System.out.println(i);
System.out.println(d);
}
}
复制代码
为什么打印出来的结果是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