JAVAにおけるfloat浮動小数点数変換についてIEEE 754標準4バイト16進数データ変換方式

2005 ワード

解析に関する具体的な書き方は、ある文章から抜粋した原文urlです.https://blog.csdn.net/mhl29/article/details/51406834
具体コード:public class TestMain{
public static void main(String[] args) {
    Float f = 11.4f;

    String s = floatToIEEE754(f);

    System.out.println(s);

    //              8        16    

//01000001=41//00110110=36//01100110=66//01100110=66
}

/**
 *   float IEEE754    
 * @param value
 * @return
 */
public static String floatToIEEE754(float value) {
    //   
    String sflag = value > 0 ? "0" : "1";

    //    
    int fz = (int) Math.floor(value);
    //       
    String fzb = Integer.toBinaryString(fz);
    //    ,  : 0.02
    String valueStr = String.valueOf(value);
    String fxStr = "0" + valueStr.substring(valueStr.indexOf("."));
    float fx = Float.parseFloat(fxStr);
    //       
    String fxb = toBin(fx);

    //   
    String e = Integer.toBinaryString(127 + fzb.length() - 1);
    //   
    String m = fzb.substring(1) + fxb;

    String result = sflag + e + m;

    while (result.length() < 32) {
        result += "0";
    }
    if (result.length() > 32) {
        result = result.substring(0, 32);
    }
    return result;
}

private static String toBin(float f) {
    List list = new ArrayList();
    Set set = new HashSet();
    int MAX = 24; //   8 

    int bits = 0;
    while (true) {
        f = calc(f, set, list);
        bits++;
        if (f == -1 || bits >= MAX)
            break;
    }
    String result = "";
    for (Integer i : list) {
        result += i;
    }
    return result;
}

private static float calc(float f, Set set, List list) {
    if (f == 0 || set.contains(f))
        return -1;
    float t = f * 2;
    if (t >= 1) {
        list.add(1);
        return t - 1;
    } else {
        list.add(0);
        return t;
    }
}

}