你如何在 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
。
0.625
乘以 2
。 0.625 => 1.25
- 存储整数部分并将其从数字中删除。将 int 部分存储在字符串
"" + "1" = "1"
中。擦除整数部分 1.25 => 0.25
0.25
大于 0
。重复
将 0.25
乘以 2
。 0.25 => 0.5
- 存储整数部分并将其从数字中删除。将 int 部分存储在字符串
"1" + "0" = "10"
中。擦除 int 部分。 0.5 => 0.5
0.5
大于 0
。重复
将 0.5
乘以 2
。 0.5 => 1.0
存储整数部分并将其从数字中删除。将 int 部分存储在字符串 "10" + "1" = "101"
中。擦除整数部分 1.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"
,其中 _
之后的部分是重复的。不幸的是,由于浮动类型的准确性和计算错误,没有简单的方法来理解它。所以对于 number 0.1
in base 2
你会得到这样的东西。
00011001100110011001100110011001100
查看 here 以了解此问题的解决方案。
我找不到任何好的示例来说明如何在 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
- 存储整数部分并将其从数字中删除。将 int 部分存储在字符串
"" + "1" = "1"
中。擦除整数部分1.25 => 0.25
0.25
大于0
。重复将
0.25
乘以2
。0.25 => 0.5
- 存储整数部分并将其从数字中删除。将 int 部分存储在字符串
"1" + "0" = "10"
中。擦除 int 部分。0.5 => 0.5
0.5
大于0
。重复将
0.5
乘以2
。0.5 => 1.0
存储整数部分并将其从数字中删除。将 int 部分存储在字符串
"10" + "1" = "101"
中。擦除整数部分1.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"
,其中 _
之后的部分是重复的。不幸的是,由于浮动类型的准确性和计算错误,没有简单的方法来理解它。所以对于 number 0.1
in base 2
你会得到这样的东西。
00011001100110011001100110011001100
查看 here 以了解此问题的解决方案。