2013-12-18 36 views
11

Vì vậy, tôi đã suy nghĩ, làm thế nào để bạn chuyển đổi một phần thập phân thành một phần thập lục phân? Một số phương pháp để chuyển đổi là gì và có cắt giảm ngắn hay không?Làm cách nào để chuyển đổi các phân số thập phân thành các phân số thập lục phân?

+0

một số ngôn ngữ cụ thể? – joseramonc

+0

Ý của bạn là gì? @JoseRamonCamacho? Chuyển đổi .2002 (base10) sang.? (Base16) – Dusteh

+0

như java, ruby, python? – joseramonc

Trả lời

19

Bạn có thể sử dụng thuật toán này:

  1. Hãy là một phần phân số của số (tức là số nguyên phần tương đương với zero)
  2. Multiply bởi phần nguyên
  3. Convert to thập lục phân và đặt nó xuống
  4. Đi tới bước 1

Ví dụ: chúng ta hãy tìm hiểu đại diện thập lục phân cho pi = 3,141592653589793 ...

nguyên phần là điều hiển nhiên - 0x3; như đối với phần thập phân (,141592653589793), chúng tôi có

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); ... 

Vì vậy pi (hệ thập lục phân) = 3.243F6A ...

thể (C#) thực hiện

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(); 
} 

thử nghiệm

Console.Write(ToHex(Math.PI)); // <- returns "3.243F6A8885A3" 
0

Bạn có thể lấy phần phân số bằng cách nhân số đầu vào với một số nguyên hex. Sau đó, bạn có thể sử dụng chuyển đổi số nguyên-sang-hex thông thường. Ví dụ: để lấy 6 ký tự sau dấu thập phân (hexa), nhân phần phân số với 0x1000000.

Đây là một số mã Java sẽ thực hiện.

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); 
} 

Số chữ số sẽ bị giới hạn bởi số nguyên lớn nhất mà bạn có thể biểu thị bằng gấp đôi.

Điều này cũng có tác dụng đối với các căn cứ hình vuông khác, ví dụ: để thay đổi bát phân digits * 4 thành digits * 3 và sử dụng Long.toOctalString.

Các vấn đề liên quan