简体   繁体   中英

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

I can't find any good examples of how I can convert a fractional decimal From base 10 to base K in C#

I'm thinking something like

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

In order to convert decimal part of number from base 10 to base K you have to multiply the number by K until there is no more fractions left in number. You have to get the integer part of number each time you do multiply and erase the integer part after getting it.

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

A simple example

Convert 0.625 from base 10 to base 2 .

  1. Multiply 0.625 by 2 . 0.625 => 1.25
  2. Store the integer part and erase it from number. store int part in string "" + "1" = "1" . erase int part 1.25 => 0.25
  3. 0.25 is bigger than 0 . repeat

  4. Multiply 0.25 by 2 . 0.25 => 0.5

  5. Store the integer part and erase it from number. store int part in string "1" + "0" = "10" . erase int part. 0.5 => 0.5
  6. 0.5 is bigger than 0 . repeat

  7. Multiply 0.5 by 2 . 0.5 => 1.0

  8. Store the integer part and erase it from number. store int part in string "10" + "1" = "101" . erase int part 1.0 => 0.0

  9. 0.0 is not bigger than 0 . The string is now fraction part of 0.625 in base 2

Note:

if you want to convert to higher base than 10 its common to use letters. for example numbers in base 16 is 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F . in this algorithm you have to replace numbers bigger than 9 into letters.

So in order to support up to base 16 change the code a little bit.

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

You can add more letters to support even higher bases.

some times you may get repeating decimals. for example number 0.1 in base 2 will be "0_0011" where the part after _ is repeating. unfortunately there is no easy way to understand it due to accuracy of floating type and errors in computation. so for number 0.1 in base 2 you will get something like this.

00011001100110011001100110011001100

Take a look at here for the solution to this problem.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM