public class A 
{
    public static int parseInt(String s)                      //返回整数字符串s表示的整数值
    {
        int x=0, i=0;
        int sign = s.charAt(0)=='-' ? -1 : 1;              //符号位,记住正负数标记 
        if (s.charAt(0)=='+' || s.charAt(0)=='-')          //跳过符号位
            i++;                                           //i记住当前字符序号
        while (i<s.length()) 
            if (s.charAt(i)>='0' && s.charAt(i)<='9')
                x = x*10+s.charAt(i++)-'0';                //x记住当前获得的整数值
            else
                throw new NumberFormatException(s);        //抛出数值格式异常
        return x*sign;                                     //返回整数值,忽略其后的字符
    }    public static double parseDouble(String s)                //返回实数字符串表示的浮点数值 
    {
        int n=s.length(), i=0;
        int sign = s.charAt(0)=='-' ? -1 : 1;              //符号位,记住正负数标记 
        double x=0, power=10.0E0;                          //power表示底数为10的幂//能够将整数赋给浮点数
        if (s.charAt(0)=='+' || s.charAt(0)=='-')          //跳过符号位
            i++;
        while (i<n && s.charAt(i)>='0' && s.charAt(i)<='9')//获得整数部分值
            x = x*10+s.charAt(i++)-'0';
        if (i<n && s.charAt(i)=='.')                       //若是小数点
        {
            i++;
            while (i<n && s.charAt(i)>='0' && s.charAt(i)<='9')//获得小数部分值
            {
                x += (s.charAt(i)-'0')/power;
                i++;
                power*=10;
            }
        }
        x *=sign;
        
        if (i<n && (s.charAt(i)=='E' || s.charAt(i)=='e'))  //处理阶码
        {
            i++;
            power = (s.charAt(i)=='-') ? 0.1 :10;           //阶码的符号位决定指数的正负及其运算
            if (s.charAt(i)=='+' || s.charAt(i)=='-')
                i++;
            int exp=0;
            while (i<n && s.charAt(i)>='0' && s.charAt(i)<='9')
                exp = exp*10+s.charAt(i++)-'0';            //获得指数的绝对值
            for (int j=0; j<exp; j++)
                x*=power;
            
            
        }
        return x; 
    } 
    
    public static void main(String args[])
    {
        String s="-12345";
        System.out.println("parseInt(\""+s+"\")="+parseInt(s));
        s="-12345.67E-2";
        System.out.println("parseDouble(\""+s+"\")="+parseDouble(s));
        double a=-12345.67E-2;
System.out.print(a);
    } 
}
为什么输出是  parseDouble("-12345.67E-2")=-123.45670000000001
不是-123.4567
改变e后面的数 会变成
parseDouble("-12345.67E-3")=-12.345670000000002

解决方案 »

  1.   

    浮点数默认是double类型。
      

  2.   

    是double类型精度就更大,精度肯定大于小数点后7位(float能精确到小数点后7位),所以不可能是-123.4567。因为计算机中不可能做到绝对精确,所以产生:parseDouble("-12345.67E-3")=-12.345670000000002这种情况。
      

  3.   

    看以查看IEEE754标准,双精度的阶码变为 11 位,移码变为为 1,023,尾数变为 53 位 (包含那个固定为 1 的隐含位)。再加上符号位,双精度浮点数的长度为 64 位。但是表示的范围(1.797693e+308~ 4.9000000e-324)明显比这大。那怎么办?当然就是近似了。所以这种表示法有些数字就是不可能被表示的。
      

  4.   

    Bigdemicl 来计算精度要求高的吧
      

  5.   

    LZ要精确值的话用Bigdemicl。 
    不要的话就四舍五入一下。
      

  6.   

    DecimalFormat df = new DecimalFormat("###.00000");

    System.out.println(df.format(-12.345670000000002));