作為Java初學者,在學習了基本數據類型之后,大哥給我布置了作業,內容如下:
計算題:假如今天逛超市花了99.99 請用加減乘除,進行計算得到99.99這個結果。
要求:1,4個方法;
2,數值隨意編寫;
3,數值要用到int、long、float、double四種類型;
4,都是返回值,實例化后打印。
一開始,我建了4個類,按照加減乘除的拼音分別命名為jia、jian、cheng、chu,代碼如下所示。
1 public class jia { //加法 2 int a = 10; 3 long b = 35; 4 float c = 36.95f; 5 double d = 18.04; 6 public void jiafa() { 7 double jia =a + b + c + d; 8 System.out.println("加法運算結果是:" + jia); 9 } 10 }
1 public class jian { //減法 2 long a = 300; 3 int b = 18; 4 float c = 128.7f; 5 double d = 53.31; 6 public void jianfa() { 7 float jian = (float)(a - b - c - (double)d); 8 System.out.println("減法運算結果是:" + jian); 9 } 10 }
1 public class cheng { //乘法 2 int a = 1; 3 long b = 1000000; 4 float c = 0.000001f; 5 double d = 99.99; 6 public void chengfa() { 7 double cheng = a * b * c * d; 8 System.out.println("乘法運算結果是:" + cheng); 9 } 10 }
1 public class chu { //除法 2 int a = 1000; 3 long b = 1000000; 4 float c = 0.001f; 5 double d = 99.99; 6 public void chufa() { 7 float chu = (float)((double)d/(a/b/c)); 8 System.out.println("除法運算結果是:" + chu); 9 } 10 }
然后,新建一個類,命名為yunsuan,將上述四則運算實例化並輸出結果,代碼如下:
1 public class yunsuan { 2 public static void main(String[] args) { 3 jia jiafa = new jia(); //實例化加法 4 jian jianfa = new jian(); //實例化減法 5 cheng chengfa = new cheng(); //實例化乘法 6 chu chufa = new chu(); //實例化除法 7 8 jiafa.jiafa(); //調用加法方法 9 jianfa.jianfa(); 10 chengfa.chengfa(); 11 chufa.chufa(); 12 } 13 }
運行結果如下圖:
除了乘法之外,其他的運算都沒有得到我想要的99.99這個結果,這是為什么呢?
經過講解和查閱資料之后,原來浮點數是不適合精確計算的,原因是計算機里面數的計算都是二進制計算的,我們其實輸入的十進制數,有些十進制數轉換成二進制是可以精確轉換,而有些轉換則不是精確轉換,得到的是一個最靠近它的數,所以這里面就存在一個誤差。另外,如果浮點數不進行計算時,在十進制里面浮點數能正確顯示,如果浮點數參與了計算,那么浮點數二進制與十進制間的轉換過程就會變得不可而知,變得不可逆。
那么要想使得到的結果精確,可以使用Java DecimalFormat 類,用於格式化十進制數字。
用法:
import java.text.DecimalFormat;
double pi = 3.1415926; DecimalFormat form = new DecimalFormat("#.00"); // #.00 表示兩位小數 #.0000四位小數 以此類推
也可以使用Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數進行精確的運算。
用法:
import java.math.BigDecimal; double a = 3.1516; BigDecimal b = new BigDecimal(Double.toString(a));
以加法為例,我們可以用BigDecimal求值,代碼示例如下:
1 import java.math.BigDecimal; 2 3 BigDecimal b1 = new BigDecimal(Double.toString(a)); 4 BigDecimal b2 = new BigDecimal(Double.toString(b)); 5 BigDecimal b3 = new BigDecimal(Double.toString(c)); 6 BigDecimal b4 = new BigDecimal(Double.toString(d)); 7 8 double a= b1.add(b2).add(b3).add(b4).doubleValue();
這里還要注意的是,除法得到的結果是Infinity,這是因為整型和整型相除,得到的仍然是整型;a = 100,b = 1000,a/b 應該等於0.001,實際上得到的是0.0,由於0不能做除數,因此得到的值是無效的,因此就需要Java數值之間的強制轉換,強制轉換是將需要轉換的數值轉換為需要的類型。
1 float chu = (float)((double)d4/(a4/b4/c4)); //錯誤寫法 2 float chu = (float)((double)d4/((float)a4/(float)b4/c4)); //正確寫法
經過深入理解,將以上代碼整合到一個yunsuan的文件里,代碼如下:
1 import java.text.DecimalFormat; 2 3 public class yunsuan { 4 public void jiafa(){ 5 int a1 = 10; 6 long b1 = 35; 7 float c1 = 36.95f; 8 double d1 = 18.04; 9 10 DecimalFormat form = new DecimalFormat("#.00");//保留兩位小數 11 double jia =a1 + b1 + c1 + d1; 12 System.out.println("加法運算結果是:" + form.format(jia)); 13 } 14 public void jianfa(){ 15 long a2 = 300; 16 int b2 = 18; 17 float c2 = 128.7f; 18 double d2 = 53.31; 19 20 DecimalFormat form = new DecimalFormat("#.00");//保留兩位小數 21 float jian = (float)(a2 - b2 - c2 - (double)d2); 22 System.out.println("減法運算結果是:" + form.format(jian)); 23 } 24 public void chengfa() { 25 int a3 = 1; 26 long b3 = 1000000; 27 float c3 = 0.000001f; 28 double d3 = 99.99; 29 30 double cheng = a3 * b3 * c3 * d3; 31 System.out.println("乘法運算結果是:" + cheng); 32 } 33 public void chufa() { 34 int a4 = 1000; 35 long b4 = 1000000; 36 float c4 = 0.001f; 37 double d4 = 99.99; 38 39 float chu = (float)((double)d4/((float)a4/(float)b4/c4)); 40 System.out.println("除法運算結果是:" + chu); 41 } 42 43 public static void main(String[] args) { 44 yunsuan jiafa = new yunsuan(); //實例化 45 yunsuan jianfa = new yunsuan(); 46 yunsuan chengfa = new yunsuan(); 47 yunsuan chufa = new yunsuan(); 48 49 jiafa.jiafa(); 50 jianfa.jianfa(); 51 chengfa.chengfa(); 52 chufa.chufa(); 53 } 54 }
親測全部為99.99,結果正確。