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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨翔 中级黑马   /  2013-4-22 14:31  /  2578 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨翔 于 2013-4-22 17:13 编辑
  1. class Test
  2. {
  3.     public static void main(String[] args)
  4.     {
  5.         double value = 4.015;
  6.         value = Math.round( value * 100 )/100.0;        
  7.               System.out.println(value);
  8.     }        
  9. }
复制代码
运行的结果是 4.01, 我不明白  既然 round 方法是四舍五入,为什么   value*100 放进去会是401.0  呢?

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

12 个回复

倒序浏览
留给大家回答,我看着呢
回复 使用道具 举报
  1. public class MathTest {
  2. public static void main(String[] args) {
  3. System.out.println("小数点后第一位=5");
  4. System.out.println("正数:Math.round(11.5)=" + Math.round(11.5));
  5. System.out.println("负数:Math.round(-11.5)=" + Math.round(-11.5));
  6. System.out.println();
  7. System.out.println("小数点后第一位<5");
  8. System.out.println("正数:Math.round(11.46)=" + Math.round(11.46));
  9. System.out.println("负数:Math.round(-11.46)=" + Math.round(-11.46));
  10. System.out.println();
  11. System.out.println("小数点后第一位>5");
  12. System.out.println("正数:Math.round(11.68)=" + Math.round(11.68));
  13. System.out.println("负数:Math.round(-11.68)=" + Math.round(-11.68));
  14. }
  15. }
复制代码
运行结果:
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,负数运算结果为整数部分。
总结:大于五全部加,等于五正数加,小于五全不加。


评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报
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)

回复 使用道具 举报
你可以试着将value*100打印出来。   这个结果是401.49999999999994      

这个作四舍五入运算结果是401

再/100  得到4.01  正好返回给value 是duble 类型的。

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 刘胜寒 于 2013-4-22 15:51 编辑

因为你求的是value*100四舍五入的值....
value*100四舍五入的值为401...
不是value四舍五入的值

这里面有个很有意思的事情
就是 value*100 的值是401.49...94
精度丢失
所以结果不是你想象中的那个啥....

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报
这个和那个 底层的 二进制 的浮点型 标准有关
回复 使用道具 举报
坐等大神详解
回复 使用道具 举报
一个十进制小数,哪怕是很简单的小数,如0.1,当你用二进制来表示时,它却是个无限环小数。十进制(0.1)=二进制(0.0001100110011....)
计算机是用二进制表示数的,存储的位长有限,只能截掉,所以误差就产生了。
所以你那个value*100就丢失了精度,很有意思吧。所以输出结果就是4.01了~~~

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报

  1. public class MathDemo
  2. {

  3.         public static void println(Object obj)
  4.         {
  5.                 System.out.println(obj);
  6.         }

  7.         public static void main(String []agrs)
  8.         {
  9.                 /*println(Math.ceil(16.3));//17.0
  10.                 println(Math.ceil(-16.3));//-16.0
  11.                 println(Math.floor(16.3));//16.0
  12.                 println(Math.floor(-16.3));//-17.0*/
  13.                 //floor地板  向下去整
  14.                 //ceil天花板        向上取整
  15.                 println("====================");
  16.                 println(Math.round(16.3));//16
  17.                 println(Math.round(-16.3));//-16
  18.                 println(Math.round(-16.5));//-16
  19.                 println(Math.round(16.5));//17

  20.                 // (long)Math.floor(a + 0.5d)
  21.                 println("====================");
  22.                 double value = 4.015;
  23.                 println(value * 100);//401.49999999999994
  24.                 println(Math.round(value*100));//401
  25.                 value = Math.round(value*100)/100.0;
  26.                 println(value);//4.01
  27.         }
  28. }
复制代码

round.png (13.38 KB, 下载次数: 27)

round.png
回复 使用道具 举报
稍后云版块会推出学习过程中问题以及对知识点的领悟收集!会有技术分奖励,敬请期待、多多参与,要注意按照进度收集问题,那样你会事半功倍。
回复 使用道具 举报
学习了.............
回复 使用道具 举报
我知道怎么回事了,我这样解释不知道对不对:
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咯。
我的代码:
  1. package com.itcast.itheima;

  2. public class RoundTest{
  3.        
  4.     public static void main(String[] args){
  5.                 double value = 4.015;
  6.                 System.out.println(value);
  7.                 System.out.println(value*100);
  8.                 System.out.println( Math.round(value * 100));
  9.                 value = Math.round( value * 100 )/100.0;        
  10.                 System.out.println(value);
  11.     }
  12. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马