0.1的2次方的正确结果应该是0.01。
我在java中调用Math.pow,算出来的结果却是0.010000000000000002。
怎么会这样呢

解决方案 »

  1.   

    在Java里long和double直接参与计算会不准确的。
    用BigDecimal类来搞。
      

  2.   

    import java.math.*;public class Power {
    public static void main(String args[]){
    double f = 0.1;

    BigDecimal B = new BigDecimal(String.valueOf(f));

    double d = B.pow(2).doubleValue();

    System.out.print(d);
    }
    }
      

  3.   

    实现规范的质量涉及到两种属性,即返回结果的准确性和方法的单调性。浮点 Math 方法的准确性根据 ulp(units in the last place,最后一位的进退位)来衡量。对于给定的浮点格式,特定实数值的 ulp 是包括该数值的两个浮点值的差。当作为一个整体而不是针对具体参数讨论方法的准确性时,引入的 ulp 数用于任何参数最差情况下的误差。如果一个方法的误差总是小于 0.5 ulp,那么该方法始终返回最接近准确结果的浮点数;这种方法就是正确舍入。一个正确舍入的方法通常能得到最佳的浮点近似值;然而,对于许多浮点方法,进行正确舍入有些不切实际。相反,对于 Math 类,某些方法允许误差在 1 或 2 ulp 的范围内。非正式地,对于 1 ulp 的误差范围,当准确结果是可表示的数值时,应该按照计算结果返回准确结果;否则,返回包括准确结果的两个浮点值中的一个。对于值很大的准确结果,括号的一端可以是无穷大。除了个别参数的准确性之外,维护不同参数的方法之间的正确关系也很重要。因此,大多数误差大于 0.5 ulp 的方法都要求是半单调的:只要数学函数是非递减的,浮点近似值就是非递减的;同样,只要数学函数是非递增的,浮点近似值就是非递增的。并非所有准确性为 1 ulp 的近似值都能自动满足单调性要求。 
    pow
    public static double pow(double a,
                             double b)返回第一个参数的第二个参数次幂的值。特殊情况如下: 
    如果第二个参数为正 0 或负 0,那么结果为 1.0。 
    如果第二个参数为 1.0,那么结果与第一个参数相同。 
    如果第二个参数为 NaN,那么结果为 NaN。 
    如果第一个参数为 NaN,第二个参数非 0,那么结果为 NaN。 
    如果 
    第一个参数的绝对值大于 1,并且第二个参数为正无穷大,或者 
    第一个参数的绝对值小于 1,并且第二个参数为负无穷大, 
    那么结果为正无穷大。 
    如果 
    第一个参数的绝对值大于 1,并且第二个参数为负无穷大,或者 
    第一个参数的绝对值小于 1,并且第二个参数为正无穷大, 
    那么结果为正 0。 
    如果第一个参数的绝对值等于1,并且第二个参数为无穷大,那么结果为 NaN。 
    如果 
    第一个参数为正 0,并且第二个参数大于 0,或者 
    第一个参数为正无穷大,并且第二个参数小于 0, 
    那么结果为正 0。 
    如果 
    第一个参数为正 0,并且第二个参数小于 0,或者 
    第一个参数为正无穷大,并且第二个参数大于 0, 
    那么结果为正无穷大。 
    如果 
    如果第一个参数为负 0,并且第二个参数大于 0 但不是有限的奇数整数,或者 
    第一个参数为负无穷大,并且第二个参数小于 0 但不是有限的奇数整数, 
    那么结果为正 0。 
    如果 
    第一个参数为负 0,并且第二个参数为正的有限奇数整数,或者 
    第一个参数为负无穷大,并且第二个参数为负的有限奇数整数, 
    那么结果为负 0。 
    如果 
    如果第一个参数为负 0,并且第二个参数小于 0 但不是有限的奇数整数,或者 
    第一个参数为负无穷大,并且第二个参数大于 0 但不是有限的奇数整数, 
    那么结果为正无穷大。 
    如果 
    第一个参数为负 0,并且第二个参数为负的有限奇数整数,或者 
    第一个参数为负无穷大,并且第二个参数为正的有限奇数整数, 
    那么结果为负无穷大。 
    如果第一个参数为小于 0 的有限值, 
    如果第二个参数为有限的偶数整数,那么结果等于第一个参数绝对值的第二个参数次幂的结果。 
    如果第二个参数为有限的奇数整数,那么结果等于负的第一个参数绝对值的第二个参数次幂的结果。 
    如果第二个参数为有限的非整数值,那么结果为 NaN。 
    如果两个参数都为整数,并且结果恰好可以表示为一个 double 值,那么该结果恰好等于第一个参数的第二个参数次幂的算术结果。
    (在前面的描述中,当且仅当浮点数为有限值并且是方法 ceil 的定点数,或者是方法 floor 的定点数时,才可以认为浮点值是整数。当且仅当将某个单参数方法应用到某个值的结果等于该值时,该值才是这个方法的定点值。) 计算结果必须在准确结果的 1 ulp 范围内。结果必须具有半单调性。 
    参数:
    a - 底数。
    b - 指数。 
    返回:
    值 ab。
      

  4.   

    import java.math.*;public class TestPower {
        public static void main(String args[]){
            double num1 = 0.1;
            BigDecimal temp = new BigDecimal(String.valueOf(num1));
            double num2 = temp.pow(2).doubleValue();
            System.out.print(num2);
        }
    }