你如何在 C# 中将以 10 为基数的小数转换为以 k 为基数 任何建议都很好

How do you convert Fractional Decimals in base 10 to base k in C# Any advice would be great

我找不到任何好的示例来说明如何在 C# 中将小数从 10 进制转换为 K 进制

我在想

double mynumber = 0.142857;
int mybase = 4;
string myNumberAsString = mynumber.ToString();

do
{
  myNumberAsString = "0123456789"[mynumber % mybase] + myNumberAsString ;
  mynumber /= mybase;
}
while (mynumber > 0);

Console.WriteLine("# in base 4 is: " + myNumberAsString);

为了将数字的小数部分从基数 10 转换为基数 K,您必须将数字乘以 K,直到数字中没有更多分数为止。每次做乘法都要取整数部分,取完整数部分要擦除。

double mynumber = 0.142857;
int mybase = 4;
string result = ""; // result will be stored here

while (mynumber > 0) // do multiply and get the int part until number is zero
{
    mynumber *= mybase; // do multiply by base and store it in number.
    result += string.Format("{0}", (int)mynumber); // store the int part.
    mynumber -= (int) mynumber; // remove the int part.
}

Console.WriteLine(result);

一个简单的例子

0.625 从基数 10 转换为基数 2

  1. 0.625 乘以 20.625 => 1.25
  2. 存储整数部分并将其从数字中删除。将 int 部分存储在字符串 "" + "1" = "1" 中。擦除整数部分 1.25 => 0.25
  3. 0.25 大于 0。重复

  4. 0.25 乘以 20.25 => 0.5

  5. 存储整数部分并将其从数字中删除。将 int 部分存储在字符串 "1" + "0" = "10" 中。擦除 int 部分。 0.5 => 0.5
  6. 0.5 大于 0。重复

  7. 0.5 乘以 20.5 => 1.0

  8. 存储整数部分并将其从数字中删除。将 int 部分存储在字符串 "10" + "1" = "101" 中。擦除整数部分 1.0 => 0.0

  9. 0.0 不大于 0。该字符串现在是基础 2

  10. 0.625 的小数部分

注:

如果你想转换成比 10 更高的基数,它是常用字母。例如,基数 16 中的数字是 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F。在此算法中,您必须将大于 9 的数字替换为字母。

所以为了最多支持 16 进制,稍微更改一下代码。

while (mynumber > 0) 
{
    mynumber *= mybase; 
    result += string.Format("{0}", "0123456789ABCDEF"[(int) mynumber]); // supports up to base 16.
    mynumber -= (int) mynumber; 
}

您可以添加更多字母以支持更高的碱基。

有时您可能会得到重复的小数。例如,基数 2 中的数字 0.1 将是 "0_0011",其中 _ 之后的部分是重复的。不幸的是,由于浮动类型的准确性和计算错误,没有简单的方法来理解它。所以对于 number 0.1 in base 2 你会得到这样的东西。

00011001100110011001100110011001100

查看 here 以了解此问题的解决方案。