如何将十进制分数转换为十六进制分数?
Posted
技术标签:
【中文标题】如何将十进制分数转换为十六进制分数?【英文标题】:How to convert decimal fractions to hexadecimal fractions? 【发布时间】:2014-01-06 04:57:53 【问题描述】:所以我在想,如何将十进制分数转换为十六进制分数? 有哪些转换方法,有没有捷径?
【问题讨论】:
某种特定的语言? 什么意思? @JoseRamonCamacho?将 .2002(base10) 转换为 .?(base16) 喜欢java、ruby、python? 不,我没有指出特定的语言,我只是想问你如何将十进制分数手动转换为十六进制分数? 【参考方案1】:你可以使用这个算法:
-
取数字的小数部分(即整数部分等于零)
乘以 16
将整数部分转换为十六进制并记下
转到步骤 1
例如,让我们找出 pi = 3.141592653589793...
的十六进制表示整数部分很明显 - 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); ...
所以pi(十六进制)= 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"
【讨论】:
【参考方案2】:您可以通过将输入数字乘以十六进制数字的整数来获得小数部分。然后您可以使用常规整数到十六进制转换。例如,要获得(十六进制)小数点后的 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 * 4
更改为digits * 3
,并使用Long.toOctalString
。
【讨论】:
以上是关于如何将十进制分数转换为十六进制分数?的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 405. 数字转换为十六进制数(补码的问题) / 166. 分数到小数(模拟长除法) / 482. 密钥格式化