我找不到任何好的例子来说明如何在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
-
0.625
乘以2
。0.625 => 1.25
- 保存整数部分并从number中擦除。在字符串
"" + "1" = "1"
中存储int部分。erase int部分1.25 => 0.25
0.25
大于0
。重复0.25
乘以2
。0.25 => 0.5
- 保存整数部分并从number中擦除。在字符串
"1" + "0" = "10"
中存储int部分。擦除部分。0.5 => 0.5
0.5
大于0
。重复0.5
乘以2
。0.5 => 1.0
保存整数部分并从number中擦除。在字符串
"10" + "1" = "101"
中存储int部分。erase int part1.0 => 0.0
0.0
不大于0
。字符串现在是基数2
中
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
看一下这个问题的解决方案