class Test {
  public static void main(String args[]){
    String inputData = "203.2";
    int z = 0;
    double numbers;
    int a = inputData.indexOf(".");
    for(int i=inputData.length()-1;i>a;i--){
      if(a==-1){
        break;
      }
      if(inputData.charAt(i)!='0'){
   z=i-a;
   break;
      }
    }
    Double doubleStr=new Double(inputData);
    numbers = doubleStr.doubleValue();
    numbers+=Math.pow(10.0,(double)-z);
    System.out.println(numbers);
  }
}我这个程序所期望的是:   输入一个数据,然后使这个数据最低位不为0的数加一。
                         比如输入 987.002  则打印出 987.003但是我发现一个问题,不知道是什么原因: 当我输入 128.2 到 255.2 这类数的时候(小数0.2不变,只变整数位),打印的结 果却是 128.299999998 或者 255.299999999998 ,并不是我所期望的128.3 和255.3请问这是为什么,如何能避免这类情况?

解决方案 »

  1.   

    double是不精确的,你可以用String来处理
      

  2.   

    请问要用String的话如何处理,这个是相加,用String不是很难实现吗
      

  3.   

    用DataFormat试试看吧(不知道会不会四舍五入)
      

  4.   

    class Test {
    public static void main(String args[]) {
    String inputData = "203.2";
    int z = 0;
    String numbers;
    String tailStr = "";
    int tailResult = 0;
    int a = inputData.indexOf(".");
    //有小数点的处理
    if (a > 0) {
    String[] dataArray = inputData.split("\\.");
    //System.out.println(dataArray.length);
    if (!"0".equalsIgnoreCase(dataArray[1].substring(dataArray[1]
    .length() - 1, dataArray[1].length()))) {
    tailStr = String
    .valueOf(Integer.parseInt("1" + dataArray[1]) + 1);
    if ("2".equalsIgnoreCase(tailStr.substring(0, 1)))//进位的处理
    tailResult = 1;
    tailStr = tailStr.substring(1, tailStr.length());
    }
    else
    tailStr = dataArray[1];
    numbers = dataArray[0] + "." + tailStr;
    } else
    numbers = String.valueOf(Integer.parseInt(inputData) + 1);
    System.out.println(numbers);
    }
    }这样不知道行不行
      

  5.   

    class Test {
    public static void main(String args[]) {
    String inputData = "203.2";
    int z = 0;
    String numbers;
    String tailStr = "";
    int tailResult = 0;
    int a = inputData.indexOf(".");
    //有小数点的处理
    if (a > 0) {
    String[] dataArray = inputData.split("\\.");
    //System.out.println(dataArray.length);
    if (!"0".equalsIgnoreCase(dataArray[1].substring(dataArray[1]
    .length() - 1, dataArray[1].length()))) {
    tailStr = String
    .valueOf(Integer.parseInt("1" + dataArray[1]) + 1);
    if ("2".equalsIgnoreCase(tailStr.substring(0, 1)))//进位的处理
    tailResult = 1;
    tailStr = tailStr.substring(1, tailStr.length());
    }
    else
    tailStr = dataArray[1];
    numbers = dataArray[0] + "." + tailStr;
    } else
    numbers = String.valueOf(Integer.parseInt(inputData) + 1);
    System.out.println(numbers);
    }
    }这样不知道行不行
      

  6.   

    上面只针对int类型,可以扩张大longtailStr = String.valueOf(Integer.parseInt("1" + dataArray[1]) + 1);
    这句为了避免小数点的第一位是0开始的的
      

  7.   

    楼上各位辛苦了,在楼上大家的启发下,我就这样来解决此问题了,如果改动太大的话很麻烦。把不精确的double用精确运算的java.math.BigDecimal 代替代码如下:import java.math.BigDecimal;class   Test   { 
        public   static   void   main(String   args[]){ 
            String   inputData   =   "203.2"; 
            int   z   =   0; 
            Double   numbers;
            double   numFinal;
            int   a   =   inputData.indexOf("."); 
            for(int   i=inputData.length()-1;i> a;i--){ 
                if(a==-1){ 
                    break; 
                } 
                if(inputData.charAt(i)!='0'){ 
                    z=i-a; 
                    break; 
                } 
            }
            numbers = Math.pow(10.0,(double)-z);
            BigDecimal  dataOne = new BigDecimal(inputData.toString());
            BigDecimal  dataTwo = new BigDecimal(numbers.toString()); 
            numFinal = dataOne.add(dataTwo).doubleValue();
            System.out.println(numFinal); 
        }