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啊?该怎么改正呢?
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啊?该怎么改正呢?
/**
* 提供精确的小数位四舍五入处理。
* @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));
}
如果你对这个要求高的话,你可以使用精确的浮点小数:java.math.BigDecimal,这个类可以用来做精确的小数运算,看该类的API:http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/math/BigDecimal.html
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重载构造
return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
中的BigDecimal.ROUND_HALF_UP应改为 BigDecimal.ROUND_DOWN