黑马程序员技术交流社区
标题:
关于round 四舍五入的疑问
[打印本页]
作者:
杨翔
时间:
2013-4-22 14:31
标题:
关于round 四舍五入的疑问
本帖最后由 杨翔 于 2013-4-22 17:13 编辑
class Test
{
public static void main(String[] args)
{
double value = 4.015;
value = Math.round( value * 100 )/100.0;
System.out.println(value);
}
}
复制代码
运行的结果是 4.01, 我不明白 既然 round 方法是四舍五入,为什么 value*100 放进去会是401.0 呢?
作者:
曹睿翔
时间:
2013-4-22 14:35
留给大家回答,我看着呢
作者:
张旺达
时间:
2013-4-22 14:39
public class MathTest {
public static void main(String[] args) {
System.out.println("小数点后第一位=5");
System.out.println("正数:Math.round(11.5)=" + Math.round(11.5));
System.out.println("负数:Math.round(-11.5)=" + Math.round(-11.5));
System.out.println();
System.out.println("小数点后第一位<5");
System.out.println("正数:Math.round(11.46)=" + Math.round(11.46));
System.out.println("负数:Math.round(-11.46)=" + Math.round(-11.46));
System.out.println();
System.out.println("小数点后第一位>5");
System.out.println("正数:Math.round(11.68)=" + Math.round(11.68));
System.out.println("负数:Math.round(-11.68)=" + Math.round(-11.68));
}
}
复制代码
运行结果:
1、小数点后第一位=5
2、正数:Math.round(11.5)=12
3、负数:Math.round(-11.5)=-11
4、
5、小数点后第一位<5
6、正数:Math.round(11.46)=11
7、负数:Math.round(-11.46)=-11
8、
9、小数点后第一位>5
10、正数:Math.round(11.68)=12
11、负数:Math.round(-11.68)=-12
根据上面例子的运行结果,我们还可以按照如下方式总结,或许更加容易记忆:
1、参数的小数点后第一位<5,运算结果为参数整数部分。
2、参数的小数点后第一位>5,运算结果为参数整数部分绝对值+1,符号(即正负)不变。
3、参数的小数点后第一位=5,正数运算结果为整数部分+1,负数运算结果为整数部分。
总结:大于五全部加,等于五正数加,小于五全不加。
作者:
张旺达
时间:
2013-4-22 14:45
public static int round(float a)返回最接近参数的 int。通过加上 1/2 将该结果舍入为整数,取结果的基数并将其强制转换为 int 类型。换句话说,结果等于以下表达式的值:
(int)Math.floor(a + 0.5f)
public static long round(double a)返回最接近参数的 long。通过加上 1/2 将该结果舍入为整数,取结果的基数并将其强制转换为 long 类型。换句话说,结果等于以下表达式的值:
(long)Math.floor(a + 0.5d)
作者:
续圆凯
时间:
2013-4-22 15:15
你可以试着将value*100打印出来。 这个结果是401.49999999999994
这个作四舍五入运算结果是401
再/100 得到4.01 正好返回给value 是duble 类型的。
作者:
刘胜寒
时间:
2013-4-22 15:45
本帖最后由 刘胜寒 于 2013-4-22 15:51 编辑
因为你求的是value*100四舍五入的值....
value*100四舍五入的值为401...
不是value四舍五入的值
这里面有个很有意思的事情
就是 value*100 的值是401.49...94
精度丢失
所以结果不是你想象中的那个啥....
作者:
壹旪傾峸
时间:
2013-4-22 16:22
这个和那个 底层的 二进制 的浮点型 标准有关
作者:
壹旪傾峸
时间:
2013-4-22 16:25
坐等大神详解
作者:
赵海洋
时间:
2013-4-22 16:37
一个十进制小数,哪怕是很简单的小数,如0.1,当你用二进制来表示时,它却是个无限环小数。十进制(0.1)=二进制(0.0001100110011....)
计算机是用二进制表示数的,存储的位长有限,只能截掉,所以误差就产生了。
所以你那个value*100就丢失了精度,很有意思吧。所以输出结果就是4.01了~~~
作者:
hacket
时间:
2013-4-22 17:09
public class MathDemo
{
public static void println(Object obj)
{
System.out.println(obj);
}
public static void main(String []agrs)
{
/*println(Math.ceil(16.3));//17.0
println(Math.ceil(-16.3));//-16.0
println(Math.floor(16.3));//16.0
println(Math.floor(-16.3));//-17.0*/
//floor地板 向下去整
//ceil天花板 向上取整
println("====================");
println(Math.round(16.3));//16
println(Math.round(-16.3));//-16
println(Math.round(-16.5));//-16
println(Math.round(16.5));//17
// (long)Math.floor(a + 0.5d)
println("====================");
double value = 4.015;
println(value * 100);//401.49999999999994
println(Math.round(value*100));//401
value = Math.round(value*100)/100.0;
println(value);//4.01
}
}
复制代码
round.png
(13.38 KB, 下载次数: 51)
下载附件
2013-4-22 17:09 上传
作者:
曹睿翔
时间:
2013-4-22 23:58
稍后云版块会推出学习过程中问题以及对知识点的领悟收集!会有技术分奖励,敬请期待、多多参与,要注意按照进度收集问题,那样你会事半功倍。
作者:
符立波
时间:
2013-4-24 12:01
学习了.............
作者:
黄茂霖
时间:
2013-4-24 15:54
我知道怎么回事了,我这样解释不知道对不对:
1.首先程序执行到 double value = 4.015; 打印出来也是4.015
2.执行到这段 value = Math.round( value * 100 )/100.0; 首先程序执行括号内的(value * 100),由于低精度往高精度走 (100是 int,value是double)返回结果是double,输出结果是401.49999999999994,如果你指定了float,那么输出的结果就是401.5
3.既然结果是double 401.49999999999994 ,那么你把它放到Math.round()函数,它当然四舍五入成401咯。
我的代码:
package com.itcast.itheima;
public class RoundTest{
public static void main(String[] args){
double value = 4.015;
System.out.println(value);
System.out.println(value*100);
System.out.println( Math.round(value * 100));
value = Math.round( value * 100 )/100.0;
System.out.println(value);
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2