官术网_书友最值得收藏!

2.2.1 四則運算符

計算機科學起源于數學,早期的計算機也確實多用于數學運算,以至于后來的各個編程語言仍然保留著古老的加減乘除四則運算。四則運算在Java語言中有專門的運算符加以表示,像加法符號“+”對應Java的“+”,減法符號“-”對應Java的“-”,乘法符號“×”對應Java的“*”,除法符號“÷”對應Java的“/”,除此之外,還有一個求余數運算,在數學上使用mod表示,而Java對應的求余運算符為“%”。它們的對照關系見表2-1。

表2-1 四則運算符號的對照關系

四則運算加求余數運算構成了Java編程的基礎算術,數字和運算符的書寫順序與大眾寫法并無差異。下面便是這幾種基本運算的代碼例子(完整代碼見本章源碼的src\com\arithmetic\operator\ Four.java):

        int sum=1+2;              // 求兩數相加之和
        System.out.println("sum="+sum);
        int differ=7-3;          // 求兩數相減之差
        System.out.println("differ="+differ);
        int product=5*6;          // 求兩數相乘之積
        System.out.println("product="+product);
        int quotient=81/9;          // 求兩數相除之商
        System.out.println("quotient="+quotient);
        int remainder=40%3;      // 求兩數相除之余數
        System.out.println("remainder="+remainder);

運行以上測試代碼,得到如下的運算日志:

sum=3

differ=4

product=30

quotient=9

remainder=1

可見上述運算結果符合平常的加減乘除邏輯。

整數的四則運算看來是波瀾不驚,倘若有小數參與運算,計算結果還是一樣的嗎?接下來先看一個除法運算,前面的除法計算的是81除以9,因為剛好能除盡,所以求得的商毫無疑義是9。那么換一種除不盡的情況,比如25除以4,按數學中的除法,此時求得的商應該是6.25。但是Java語言另有規定,如果被除數和除數都是整型數,求得的商也只能是整型數,故而25除以4得到的商變成了6,也就是省略了小數部分。要想讓這個商成為包括小數部分的數值,就必須讓被除數和除數之一變成小數,只有其中一個是小數,Java才會把整數的除法運算轉換為小數的除法運算。例如25.0/4、25/4.0、25.0/4.0這3種寫法都將變成雙精度類型的除法,最后求得的商也變作了雙精度數6.25。

下面是前述的除法運算用到的實驗代碼:

        // 若被除數和除數都是整數,則求得的商為去掉小數部分的整數
        int quotientInt=25/4;
        System.out.println("quotientInt="+quotientInt);
        // 若被除數和除數只有一個是浮點或雙精度數,則求得的商保留小數部分
        double quotientDouble=25.0/4;  // 25/4.0的運算結果跟25.0/4是一樣的
        System.out.println("quotientDouble="+quotientDouble);

運行上面的實驗代碼,打印出來的運算日志如下:

quotientInt=6

quotientDouble=6.25

然而對小數做除法運算,有時候計算結果并不精確,譬如以下的測試代碼:

        // 因float和double類型為約數表示,故相除得到的商也是約數,不能保證小數部分是精確的
        double quotientDecimal=8.1/3;
        System.out.println("quotientDecimal="+quotientDecimal);
        // 對浮點數和雙精度數求余數,也存在約數造成的問題,即余數的小數部分可能并不準確
        double remainderDecimal=5.1%2;
        System.out.println("remainderDecimal="+remainderDecimal);

這個測試代碼的運算很簡單,8.1除以3正常求得的商為2.7,至于5.1除以2的余數正常應為1.1。可是一旦運行上述的測試代碼,會發現結果竟然是下面這樣的:

quotientDecimal=2.6999999999999997

remainderDecimal=1.0999999999999996

以上得到的商和余數真是叫人目瞪口呆,說好的2.7和1.1怎么變了呢?其實這種情況在一開始便埋下伏筆了,之前介紹浮點類型和雙精度類型時,提到它們本身并非精準的數值,而是一個尾數乘以10的若干次方,并且浮點類型的精度只有6~7位,雙精度類型的精度則為15~16位,精度以外的數字純屬打醬油的。現在Java對小數做除法運算,打醬油部分的數字也來湊熱鬧,本來能除得盡的小數,由于些許的偏差反而變得除不盡了,以至于造成畫蛇添足的尷尬。這就告訴我們,要謹慎對待小數的除法和取余數運算。

主站蜘蛛池模板: 大庆市| 苍山县| 漠河县| 昭通市| 绥德县| 中方县| 海原县| 濮阳县| 景宁| 龙游县| 融水| 诏安县| 临夏市| 海淀区| 井冈山市| 土默特左旗| 湟中县| 临海市| 南雄市| 拜城县| 永吉县| 龙游县| 南昌市| 新津县| 名山县| 墨竹工卡县| 忻州市| 慈溪市| 九江县| 乡城县| 德兴市| 普兰县| 三原县| 鄂伦春自治旗| 吴川市| 平昌县| 蒙自县| 秦安县| 双峰县| 通化市| 岚皋县|