程序用减法实现除法的功能,但为什么实现时有的位数不可控制
程序:
package Abc;
public class division {
public division(double dividend, double divitor, int save) {
double s = 0,i,t,b;
for (int j = 0; j <= save; j++) {
 i = 0;
while (true) {
b=Math.pow(10, (-1 * j));
t=(double)(divitor * b);
dividend = dividend - t;
if (dividend < 0)
break;
// System.out.println(dividend);
i++;
// System.out.println(i);
// System.out.println(s);
}
            s=s+i * Math.pow(10, (-1 * j));
dividend = (double)(dividend + divitor * Math.pow(10, (-1 * j)));
// System.out.println(i);
}
System.out.println(s);
// System.out.println(Math.pow(10, (-1*save)));
} public static void main(String[] args) {
for(int i=0;i<6;i++){
new division(5, 3, i);
// System.out.println(" ");
}
}}
结果:
1.0
1.6
1.6600000000000001
1.6660000000000001
1.6666
1.66666
调试时,发现当for中i=1时;t最后变成了
this division  (标识=20)
dividend 1.7
divitor 3.0
save 1
s 1.0
j 1
i 1.0
b 0.1
t 0.30000000000000004
为什么 b=Math.pow(10, (-1 * j));//j=1
t=(double)(divitor * b);
t=0.30000000000000004

解决方案 »

  1.   

    要精确计算最好使用BigDecimal,具体使用去看看API就知道了
      

  2.   

    可以控制的,要用BigDecimal格式化
      

  3.   

    第三种方法测试未通过,其他三种方法都测试通过java保留两位小数问题:方式一:四舍五入 
    double f = 111231.5585; 
    BigDecimal b = new BigDecimal(f); 
    double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); 
    保留两位小数 
    ---------------------------------------------------------------方式二:java.text.DecimalFormat df =new java.text.DecimalFormat("#.00"); 
    df.format(你要格式化的数字);例:new java.text.DecimalFormat("#.00").format(3.1415926)#.00 表示两位小数 #.0000四位小数 以此类推...方式三:double d = 3.1415926;String result = String .format("%.2f");%.2f %. 表示 小数点前任意位数 2 表示两位小数 格式后的结果为f 表示浮点型方式四:NumberFormat ddf1=NumberFormat.getNumberInstance() ;void setMaximumFractionDigits(int digits) 
    digits 显示的数字位数 
    为格式化对象设定小数点后的显示的最多位,显示的最后位是舍入的