import javax.swing.JOptionPane;
public class One {
public static void main(String[] args) {
String str = JOptionPane.showInputDialog("请输入一个浮点数");
Double i = Double.parseDouble(str);

double j =  Math.floor(i);
double k = i - j;
System.out.println(i + "的整数部分是:" + j);
System.out.println(i + "的小数部分是:" + k);

}
}
为什么我输入1.2它的小数部分成了1.999999999996啊?该怎么改正呢?

解决方案 »

  1.   


    /**
     * 提供精确的小数位四舍五入处理。
     * @param v 需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的结果
     */
    public static double round(double v,int scale){
    if(scale < 0){
    throw new IllegalArgumentException("The scale must be a positive integer or zero");
    }
    BigDecimal b = new BigDecimal(Double.toString(v));
    BigDecimal one = new BigDecimal("1");
    return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
     public static void main(String[] args) {
        String str = JOptionPane.showInputDialog("请输入一个浮点数");
        Double i = Double.parseDouble(str);
        
        double j =  Math.floor(i);
        double k = i - j;
        System.out.println(i + "的整数部分是:" + j);
        System.out.println(i + "的小数部分是:" + round(k,1)); 
        }
      

  2.   

    因为浮点小数在计算机中本就代表一个近似值,不是一个精确的数。
    如果你对这个要求高的话,你可以使用精确的浮点小数:java.math.BigDecimal,这个类可以用来做精确的小数运算,看该类的API:http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/math/BigDecimal.html
      

  3.   

    import java.math.BigDecimal;import javax.swing.JOptionPane;
    public class One {
        public static void main(String[] args) {
        String str = JOptionPane.showInputDialog("请输入一个浮点数");
        Double i = Double.parseDouble(str);
        
        double j =  Math.floor(i);
        BigDecimal b1=new BigDecimal(i+"");
        BigDecimal b2=new BigDecimal(j+"");
        BigDecimal b3=b1.subtract(b2);
        double k = i - j;
        System.out.println(i + "的整数部分是:" + b2.doubleValue());
        System.out.println(i + "的小数部分是:" + b3.doubleValue());
        
        }
    }
    这是由Double得toString机制影响了结果,用double进行减法等运算式部精确的,解决方法就是用BigDecimal,但是构造的时候用参数为String重载构造
      

  4.   

    1楼
    return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    中的BigDecimal.ROUND_HALF_UP应改为 BigDecimal.ROUND_DOWN