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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈中岩 中级黑马   /  2013-4-16 05:36  /  1841 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈中岩 于 2013-4-16 12:26 编辑

我的问题是保留一个小数的后两位,而不是小数点的后两位。我早上1点就起床思索这个问题,就是不知道怎么办。
我也有过想法

  1. //思想:先获取这个数的整数位,然后这个数减去整数位,得到的是0.xxxxxxx
  2.                 //1,转换成字符串,然后反转就是xxxxxxx.0,取出前两位
  3.                 //2,取出后再反转
  4.                 //乘以0.1的这个数组长度-2次幂
  5.          //得出的数即可
  6. class MathTest2
  7. {         
  8.         public static void main(String[] args)
  9.         {
  10.                 LastTwo(3.12345);
  11.         }
  12. public static void LastTwo(double d)
  13.         {
  14.         
  15.                 //取得这个数的整数位i
  16.                 double i = Math.floor(d);
  17.                 //转换成整型
  18.                 sop("测试i="+i);
  19.                 int l = (int)Math.round(i);
  20.                
  21.                 sop("测试l="+l);
  22.                 //取得这个整数的小数部分xs
  23.                 double xs = (d-l);
  24.                
  25.                 sop("测试xs="+xs);
  26.                 //转换成字符串
  27.                 //String s = new Double(xs).toString();
  28.         //char[] chs = s.toCharArray();
  29.         //TreeSet<String> ts = new TreeSet<String>(Collections.reverseOrder(s));
  30.         
  31.         }
  32.         
  33.         public static void sop(Object obj)
  34.         {
  35.                 System.out.println(obj);
  36.         }
  37. }
  38.         
复制代码
但是:测试i=3.0
测试l=3
测试xs=0.12345000000000006

为啥xs是0.12345000000000006???

求高人指点一二。
再明确一下我想要的:比如输入3.12345得出的结果是0.00045

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

4 个回复

倒序浏览
由于Java的简单类型不能够精确的对浮点数进行运算,简单的说就是计算机存的小数是以分数的形式存的,在我们调用的时候如果这个分数出现循环就会损失精度。在商业计算中我们要用 java.math.BigDecimal
所以
//取得这个整数的小数部分xs
                double xs = (d-l);
                sop("测试xs="+xs);
输出为错误的

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
double d=3.141592;
double c=d-(int)3.141594;小数部份
d=(int)3.141592;
d+=((int)(c*100))/100;留几位就*几位的整数.通过设置这个,可以随意保留任意位数.
回复 使用道具 举报
  1. double d=3.141523;
  2.                 StringBuilder num=new StringBuilder(new Double(d).toString());
  3.                 int index=num.indexOf(".");
  4.                 d=Double.parseDouble(num.delete(index+1, num.length() - 2).toString());
  5.                 System.out.println(d);
复制代码
//3.23你要的是这个结果吧,刚开始没仔细看题目

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马