对于Double oneDouble = 33.3303300d;
Double twoDouble = 333303300d;
Long oneLong = -393030L;如何求他们的精度,就是最后一位非零数字所在精度,即输出---oneDouble--- 0.00001
---twoDouble--- 100
---oneLong--- 10

解决方案 »

  1.   

    import java.math.*;public class GetScale {
    public static void main(String args[]){
    double oneDouble = 33.3303300d; 
    double twoDouble = 333303300d; 

    BigDecimal bd = new BigDecimal(oneDouble + "");
    BigDecimal bd2 = new BigDecimal(twoDouble + "");

    System.out.println(bd.scale());
    System.out.println(bd2.scale());
    }
    }
    输出时5和-2,自己再处理下吧!
      

  2.   

    嗯,很好double oneDouble = 33.3303300d; 
    double twoDouble = 333303300d; 
            
    BigDecimal bd = new BigDecimal(oneDouble + "");
    BigDecimal bd2 = new BigDecimal(twoDouble + "");System.out.println("oneDouble:"+1/Math.pow(10, bd.scale()));
    System.out.println("oneDouble:"+1/Math.pow(10, bd2.scale()));输出:oneDouble:1.0E-5
    oneDouble:100.0就可以得到想要的,不过不知道当数比较复杂时,会不会丢精度。如果是这样:System.out.println("oneDouble:"+Math.pow(10, -1*bd.scale()));
    System.out.println("oneDouble:"+Math.pow(10, -1*bd2.scale()));则输出:oneDouble:9.999999999999999E-6
    oneDouble:100.0就丢了精度。
      

  3.   

    现在又碰到个问题:Long oneNum = 38900L;
    BigDecimal bd4 = new BigDecimal(oneNum + "");
    System.out.println("1oneNum:"+1/Math.pow(10, bd4.scale()));
    System.out.println("2oneNum:"+Math.pow(10, bd4.scale()));
    BigDecimal bd5 = new BigDecimal(oneNum.doubleValue() + "");
    System.out.println("3oneNum:"+1/Math.pow(10, bd5.scale()));
    System.out.println("4oneNum:"+Math.pow(10, bd5.scale()));
    输出:1oneNum:1.0
    2oneNum:1.0
    3oneNum:0.1
    4oneNum:10.0却又变得与Double的数相反了。不管oneNum值是正的负的,类型是Float的还是Long
    对BigDecimal还是不了解
      

  4.   

    精度丢失是因为你计算导致的 想要精确控制精度 用BigDecimal类来做吧
      

  5.   

    但是,奇怪的是:如果是这样:BigDecimal bd4 = new BigDecimal(100.222+1000000000000d+"");则可以得到正确结果,也许是数不够大的原因,
    当然如果这样
    BigDecimal bd4 = new BigDecimal("99999999"+100.22);
    可以得到正确结果,但
    BigDecimal bd4 = new BigDecimal("99999999"+100);
    就又不行了以上原因,那位高人来解答一下!只要10000000000000不会比前面那个数小,而且不会溢出的话,还是可以将就着用的