如何在c#中将以10为基数的小数转换为以k为基数的小数?

  • 本文关键字:小数 转换 c# radix
  • 更新时间 :
  • 英文 :


我找不到任何好的例子来说明如何在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. 保存整数部分并从number中擦除。在字符串"" + "1" = "1"中存储int部分。erase int部分1.25 => 0.25
  3. 0.25大于0。重复

  4. 0.25乘以20.25 => 0.5

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

  7. 0.5乘以20.5 => 1.0

  8. 保存整数部分并从number中擦除。在字符串"10" + "1" = "101"中存储int部分。erase int part 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",其中_之后的部分是重复的。不幸的是,由于浮点类型的精度和计算中的错误,没有简单的方法来理解它。那么对于以2为基数的数字0.1,你会得到这样的结果。

00011001100110011001100110011001100

看一下这个问题的解决方案

相关内容

  • 没有找到相关文章

最新更新