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
.
- Multiply
0.625
by 2
. 0.625 => 1.25
- Store the integer part and erase it from number. store int part in string
"" + "1" = "1"
. erase int part 1.25 => 0.25
0.25
is bigger than 0
. repeat
Multiply 0.25
by 2
. 0.25 => 0.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
0.5
is bigger than 0
. repeat
Multiply 0.5
by 2
. 0.5 => 1.0
Store the integer part and erase it from number. store int part in string "10" + "1" = "101"
. erase int part 1.0 => 0.0
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.