通過這道習(xí)題,你會更加了解浮點數(shù)

《寫給大忙人看的java核心技術(shù)》的第一章的第一題,題目很簡單,但其中有一個問題,涉及到浮點數(shù)中的0到底有多大的問題。浮點數(shù)其實并不能簡單理解為小數(shù),浮點數(shù)是一個是一個稀疏的、不連續(xù)的數(shù)集,因此我們用的浮點數(shù)除了某些值是精確表示,剩下的大部分都是近似表示。詳細(xì)可參看迷渡大神的這篇文章:代碼之謎(四)- 浮點數(shù)(從驚訝到思考)

所以在編程的過程當(dāng)中就會出現(xiàn)兩個需要注意的點:

  1. 除以 Int 0會報錯,但是除以 float 0會得到Infinity。
    -浮點數(shù)的零是由一個極小的小數(shù)近似得到的,所以用1去除 float 0得到的是一個極大的值,表現(xiàn)為Infinity
//測試1%0.0
    private static float zeroTest(int decimal){
        float flo = 1 / (float) decimal;
        return flo;
    }

得到的結(jié)果為
RES = Infinity

  1. 因為浮點數(shù)數(shù)值不精確,求兩個浮點數(shù)的值是否相等是一個近似的判斷,而且判斷的精度不定。同樣的原因,浮點數(shù)的數(shù)學(xué)運算得到的都是近似結(jié)果。需要更高精度的運算需要使用BigDecimal。
    //測試浮點數(shù)相等
    private static boolean equalTest1(){
        float a=0.000000008f;
        float b=0.000000009f;
        return a==b;
    }
    //測試浮點數(shù)相等
    private static boolean equalTest2(){
        float a=10.000000000f;
        float b=10.000000009f;
        return a==b;
    }

得到的結(jié)果為
RES1 = false
RES2 = true
后者相差更大但后者相等前者不相等。

最后是我對習(xí)題的解答,有寫的不好的地方希望得到指教。

第一章,第一題
讀一個整數(shù)并以二進(jìn)制、八進(jìn)制、十六進(jìn)制輸出。 以十六進(jìn)制浮點數(shù)輸出倒數(shù)。

package chapter1;

/**
 * 讀一個整數(shù)并以二進(jìn)制、八進(jìn)制、十六進(jìn)制輸出。 以十六進(jìn)制浮點數(shù)輸出倒數(shù)。
 * 2017/1/6
 * @author 游韌八荒
 *
 */
public class Demo1 {
    // 十進(jìn)制轉(zhuǎn)二進(jìn)制
    private static String toBinary(int decimal) {
        int binary = 0;
        int digit = 0;
        for (int temp = decimal; temp >= 1; digit++) {
            int remainder = temp % 2;
            temp = temp / 2;
            binary = binary + (int) Math.pow(10, digit) * remainder;
        }
        return Integer.toString(binary);
    }

    // 十進(jìn)制轉(zhuǎn)八進(jìn)制
    private static String toOctonary(int decimal) {
        int octonary = 0;
        int digit = 0;
        int temp = decimal;
        while (temp >= 1) {
            int remainder = temp % 8;
            temp = temp / 8;
            octonary = octonary + (int) Math.pow(10, digit) * remainder;
            digit++;
        }
        return Integer.toString(octonary);
    }

    // 十進(jìn)制轉(zhuǎn)十六進(jìn)制
    private static String toHexadecimal(int decimal) {
        String hexadecimal = "";
        for (int temp = decimal; temp >= 1;) {
            int remainder = temp % 16;
            temp = temp / 16;
            String remainderStr = "";
            
            switch (remainder) {
            case 10:
                remainderStr = "A";
                break;
            case 11:
                remainderStr = "B";
                break;
            case 12:
                remainderStr = "C";
                break;
            case 13:
                remainderStr = "D";
                break;
            case 14:
                remainderStr = "E";
                break;
            case 15:
                remainderStr = "F";
                break;
            default:
                remainderStr = Integer.toString(remainder);
            }
            
            hexadecimal = remainderStr + hexadecimal;
        }
        return hexadecimal;
    }

    // 以十六進(jìn)制浮點數(shù)輸出倒數(shù)
    /*
     * 第一次將小數(shù)乘以十六,得到的數(shù)的整數(shù)部分就是小數(shù)的第一位,然后,去掉整數(shù)后的小數(shù)又乘以十六,
     * 又將得到的數(shù)的整數(shù)作為小數(shù)點后的第二位。依次乘下去。直到都乘為整數(shù),到最后一位。
     */
    private static String toReciprocal(int decimal) {
        if(decimal == 0){
            return "參數(shù)不能為0";
        }
        float flo = 1 / (float) decimal;
        String reciprocal = "0.";
        for (int i = 0; i<10; i++) {
            if(flo == 0){
                break;
            }
            float temp = flo * 16;
            int inte = (int) Math.floor(temp);
            flo = temp - inte;
            String inteStr = "";
            
            switch (inte) {
            case 10:
                inteStr = "A";
                break;
            case 11:
                inteStr = "B";
                break;
            case 12:
                inteStr = "C";
                break;
            case 13:
                inteStr = "D";
                break;
            case 14:
                inteStr = "E";
                break;
            case 15:
                inteStr = "F";
                break;
            default:
                inteStr = Integer.toString(inte);
            }
            reciprocal = reciprocal + inteStr;
        }
        return reciprocal;
    }

    public static void main(String[] args) {
        System.out.println(toBinary(10));
        System.out.println(Integer.toBinaryString(10));
        System.out.println(toOctonary(10));
        System.out.println(Integer.toOctalString(10));
        System.out.println(toHexadecimal(111));
        System.out.println(Integer.toHexString(111));
        System.out.println(toReciprocal(111));
    }
}
/*
 * 現(xiàn)有方法
 * 
 * 十進(jìn)制轉(zhuǎn)成十六進(jìn)制: Integer.toHexString(int i) 十進(jìn)制轉(zhuǎn)成八進(jìn)制 Integer.toOctalString(int i)
 * 十進(jìn)制轉(zhuǎn)成二進(jìn)制 Integer.toBinaryString(int i) 十六進(jìn)制轉(zhuǎn)成十進(jìn)制
 * Integer.valueOf("FFFF",16).toString() 八進(jìn)制轉(zhuǎn)成十進(jìn)制
 * Integer.valueOf("876",8).toString() 二進(jìn)制轉(zhuǎn)十進(jìn)制
 * Integer.valueOf("0101",2).toString()
 * 
 * long整形:數(shù)字+L,float:數(shù)字+F,double:數(shù)字+D
 * 
 * 二進(jìn)制:0b+數(shù)字,八進(jìn)制:0+數(shù)字,十六進(jìn)制:0x+數(shù)字
 * 
 */

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容