public class MathTest {     public void test11(String[] s){
BigDecimal[] d = new BigDecimal[s.length];
for(int i=0,ii=s.length;i<ii;i++){
d[i] = new BigDecimal(s[i]);//s[i]先转换成double类型也不行
}
for(int i=0,ii=d.length;i<ii;i++){
for(int j=i+1,len=s.length;i<len;i++){
if(d[i].compareTo(d[j])<0){
BigDecimal temp = d[i];
d[i] = d[j];
d[j] = temp;
}
}
}
for(int i=0,ii=d.length;i<ii;i++){
System.out.println(d[i]);
}
}
public static void main(String[] args) {
String[] s="23414","1.3453","431241.3451531","432143.3412","432143.3413","432143.3411"};
new MathTest().test11(s);

}

实数比较用BigDecimal怎么结果顺序还是不变?
要怎么样比较?

解决方案 »

  1.   

    public int compareTo(BigDecimal val)    将此 BigDecimal 与指定的 BigDecimal 比较。根据此方法,值相等但具有不同标度的两个 BigDecimal 对象(如,2.0 和 2.00)被认为是相等的。相对六个 boolean 比较运算符 (<, ==, >, >=, !=, <=) 中每一个运算符的各个方法,优先提供此方法。建议使用以下语句执行上述比较:(x.compareTo(y) <op> 0),其中 <op> 是六个比较运算符之一。 当此 BigDecimal 在数字上小于、等于或大于 val 时,返回 -1、0 或 1。建议使用以下语句执行上述比较:(x.compareTo(y) <op> 0),其中 <op> 是六个比较运算符之一。
      

  2.   

    13行 for(int j=i+1,len=s.length;i<len;i++) 改为 for(int j=i+1,len=s.length;j<len;j++)
      

  3.   

    你在写冒泡法排序时,内循环的for写错了。原代码:
    for(int j=i+1,len=s.length;i<len;i++)把这句中的 i 改成 j 就对了。
      

  4.   

    for循环的问题,呵呵
    方法是对的
      

  5.   

    呵呵,还是3楼更快。其实那句代码可以写得更简单一些:
    for(int j=i+1;j<s.length;j++)
    其它循环中也没有必要单独再定义一个变量去保存数组的长度这是我改完之后的代码:import java.math.BigDecimal;public class MathTest {     public void test11(String[] s){
            BigDecimal[] d = new BigDecimal[s.length];
            for(int i=0;i<s.length;i++){
                d[i] = new BigDecimal(s[i]);
            }
            for(int i=0;i<d.length;i++){
                for(int j=i+1;j<s.length;j++){
                    if(d[i].compareTo(d[j])<0){
                        BigDecimal temp = d[i];
                        d[i] = d[j];
                        d[j] = temp;
                    }
                }
            }
            for(int i=0; i<d.length;i++){
                System.out.println(d[i]);
            }
        }    public static void main(String[] args) {
            String[] s={"23414","1.3453","431241.3451531","432143.3412","432143.3413","432143.3411"};
            new MathTest().test11(s);
        }
    }
    以下是输出结果:432143.3413
    432143.3412
    432143.3411
    431241.3451531
    23414
    1.3453
      

  6.   

    也可以用Arrays.sort()来进行比较import java.math.*;
    import java.util.*;public class MathTest {    public static void main(String[] args) {
            String[] s={"23414","1.3453","431241.3451531","432143.3412","432143.3413","432143.3411"};
            Arrays.sort(s, new Comparator(){
             public int compare(Object o1, Object o2){
             return new BigDecimal(o1.toString()).compareTo(new BigDecimal(o2.toString()));
             }
            });
            for(int i=0; i<s.length;i++){
                System.out.println(s[i]);
            }
        }
    }
      

  7.   

    BigDecimal 是标准的类,在编译器中不需要特殊支持,它可以表示任意精度的小数,并对它们进行计算。在内部,可以用任意精度任何范围的值和一个换算因子来表示 BigDecimal,换算因子表示左移小数点多少位,从而得到所期望范围内的值。因此,用 BigDecimal 表示的数的形式为 unscaledValue*10-scale。  用于加、减、乘和除的方法给 BigDecimal 值提供了算术运算。由于 BigDecimal 对象是不可变的,这些方法中的每一个都会产生新的 BigDecimal 对象。因此,因为创建对象的开销,BigDecimal 不适合于大量的数学计算,但设计它的目的是用来精确地表示小数。如果您正在寻找一种能精确表示如货币量这样的数值,则 BigDecimal 可以很好地胜任该任务。  如浮点类型一样,BigDecimal 也有一些令人奇怪的行为。尤其在使用 equals() 方法来检测数值之间是否相等时要小心。equals() 方法认为,两个表示同一个数但换算值不同(例如,100.00 和 100.000)的 BigDecimal 值是不相等的。然而,compareTo() 方法会认为这两个数是相等的,所以在从数值上比较两个 BigDecimal 值时,应该使用 compareTo() 而不是 equals()。
      

  8.   

    读着读着API,
    靠,竟然发现这几个类已经实现了Comparabe接口,我们的排序白干了哈哈
    直接用这个
    Arrays.sort(d);
    搞定~~~~
      

  9.   

    呵呵,API是个好东西...得先学会怎么查.
      

  10.   

    for(int j=i+1,len=s.length;j <len;j++)