2013-12-18 15 views
11

私は考えていましたが、小数部分を16進小数にどのように変換しますか? 変換にはいくつかの方法があり、ショートカットはありますか?小数部分を16進小数に変換するにはどうすればよいですか?

あなたはこのアルゴリズムを使用することができます
+0

特定の言語ですか? – joseramonc

+0

どういう意味ですか? @JoseRamonCamacho? .2002(base10)を。?(base16) – Dusteh

+0

にjava、ruby、pythonのように変換しますか? – joseramonc

答えて

19

:16進数に

  • 変換の整数部分で(つまり、整数部分がゼロに等しい)
  • 乗算を数値の小数部を取り、それを置く

    1. をダウン
    2. ゴーさんは見つける聞かせて、例えば1

    をステップPI = 3.141592653589793 ...

    整数部分の16進表現は明らかである - を0x3。小数部分(0.141592653589793)用として、私たちは

    0.14159265358979 * 16 = 2.26548245743664; int part 2 (0x2); frac 0.26548245743664 
        0.26548245743664 * 16 = 4.24771931898624; int part 4 (0x4); frac 0.24771931898624 
        0.24771931898624 * 16 = 3.96350910377984; int part 3 (0x3); frac 0.96350910377984 
        0.96350910377984 * 16 = 15.41614566047744; int part 15 (0xF); frac 0.41614566047744 
        0.41614566047744 * 16 = 6.65833056763904; int part 6 (0x6); frac 0.65833056763904 
        0.65833056763904 * 16 = 10.53328908222464; int part 10 (0xA); ... 
    

    のでパイ(16進数)= 3.243F6A ...

    可能性(C#)の実装

    public static String ToHex(Double value) { 
        StringBuilder Sb = new StringBuilder(); 
    
        if (value < 0) { 
        Sb.Append('-'); 
    
        value = -value; 
        } 
    
        // I'm sure you know how to convert decimal integer to its hexadecimal representation 
        BigInteger bi = (BigInteger) value; 
        Sb.Append(bi.ToString("X")); 
    
        value = value - (Double)bi; 
    
        // We have integer value in fact (e.g. 5.0) 
        if (value == 0) 
        return Sb.ToString(); 
    
        Sb.Append('.'); 
    
        // Double is 8 byte and so has at most 16 hexadecimal values 
        for (int i = 0; i < 16; ++i) { 
        value = value * 16; 
        int digit = (int) value; 
    
        Sb.Append(digit.ToString("X")); 
    
        value = value - digit; 
    
        if (value == 0) 
         break; 
        } 
    
        return Sb.ToString(); 
    } 
    

    テスト

    を持っています
    Console.Write(ToHex(Math.PI)); // <- returns "3.243F6A8885A3" 
    
  • 0

    入力数値に16進数の整数を掛けて小数部分を得ることができます。その後、通常の整数から16進への変換を使用できます。たとえば、(ヘキサ)小数点の後に6文字を取得するには、小数部に0x1000000を掛けます。

    これを行うJavaコードを次に示します。

    String toHexFraction(double x, int digits) { 
        // Get fractional part. 
        if (x < 0.0) 
         x = 0.0 - x; 
        x = x % 1.0; 
    
        // Shift left by n digits 
        long multiplier = (1L << (digits * 4)); 
        long fraction = (long)(x * multiplier); 
    
        // Convert integer to hex string. 
        // String should have at least n digits; prefix with zeros if not. 
        String hex = Long.toHexString(fraction); 
        String padding = "000000000000000"; 
        hex = padding.substring(0, digits - hex.length()) + hex; 
    
        return hex; 
    } 
    
    String toHexInteger(double x) { 
        long whole = (long) x; 
        String prefix; 
        if (whole < 0) { 
         // Long.toHexString treats the number as an unsigned integer. 
         whole = 0 - whole; 
         prefix = "-"; 
        } else { 
         prefix = ""; 
        } 
        return Long.toHexString(whole); 
    } 
    
    String toHex (double x, int digits) { 
        return toHexInteger(x) + "." + toHexFraction(x, digits); 
    } 
    

    数字の桁数は、ダブルで表すことのできる最大の整数で制限されます。

    これは他の四角形のベースにも有効です(例:オクタル変更の場合はdigits * 4digits * 3Long.toOctalStringを使用します。

    関連する問題