C#从Base转换为Decimal变得疯狂

时间:2017-03-21 09:55:26

标签: c# binary type-conversion decimal base

所以我想知道将任何基数转换为十进制(基数为10):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SoloLearn
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("What is the number you want to convert?");
            string num = Console.ReadLine();
            Console.WriteLine("In what base is this number?");
            int mathBase = int.Parse(Console.ReadLine());
            double output = 0;
            int j = 0;
            char[] nums = num.ToCharArray();
            for(int i=num.Length - 1; i>=0; i--) {
               output = output + Math.Pow(mathBase,i) * nums[j] * 1;
               Console.WriteLine("i: " + i +", j:" + j + ", nums[j]: " + nums[j] + ", output: " + output + ", mathBase: " + mathBase + ", " + Math.Pow(mathBase,i) + ".");
               j++; 
            }
            Console.WriteLine("The number " + num + " in base 10 (Decimal) is " + output + ".");
            Console.ReadLine();
        }
    }
}

所以我开始使用二进制文件(num = 100,mathBase = 2),但答案很疯狂。这就是为什么我添加这个代码来看看发生了什么:

Console.WriteLine("i: " + i +", j:" + j + ", nums[j]: " + nums[j] + ", output: " + output + ", mathBase: " + mathBase + ", " + Math.Pow(mathBase,i) + "."); 
j++;  

而且,所有变量都是正确的:

This is the output and code

所以是的,我真的不知道会发生什么,因为所有的计算似乎都是正确的(Math.Pow(mathBase,i) = 2^2 = 4,如图所示但是4 * nums[j] = 4 * 1 = 196?如果有人知道发生了什么,请告诉我! / p>

3 个答案:

答案 0 :(得分:1)

您的问题是numschar[]。因此nums[j]是一个字符。现在你遇到的问题是char可以隐式转换为数字而不是你想要的方式 - 它使用的是ascii值,因此1是ascii值49和0是ascii值48.这就是数学错误。

您需要做的是将输入sting转换为int数组,而不是字符数组。可能执行此操作的一些示例代码是:

int[] nums = num.Select(x=>x-'0').ToArray();

这样做是因为字符0-9是ascii 48-57这一事实,如果你从ascii 0(48)中取出每一个,你将得到0-9。它还利用了一个字符串也是IEnumerable<char>的事实,因此可以很容易地LINQed。

通过此修改,您的程序应该按预期工作。

答案 1 :(得分:0)

这里num [j]是一个char,所以你应该在任何计算之前将它转换为int。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SoloLearn
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("What is the number you want to convert?");
            string num = Console.ReadLine();
            Console.WriteLine("In what base is this number?");
            int mathBase = int.Parse(Console.ReadLine());
            double output = 0;
            int j = 0;
            char[] nums = num.ToCharArray();
            for(int i=num.Length - 1; i>=0; i--) {
               output = output + Math.Pow(mathBase,i) * Int32.Parse(nums[j].ToString()) * 1;
               Console.WriteLine("i: " + i +", j:" + j + ", nums[j]: " + nums[j] + ", output: " + output + ", mathBase: " + mathBase + ", " + Math.Pow(mathBase,i) + ".");
               j++; 
            }
            Console.WriteLine("The number " + num + " in base 10 (Decimal) is " + output + ".");
            Console.ReadLine();
        }
    }
}

答案 2 :(得分:0)

任意基数转换时,您必须至少处理三个范围

$absolute_url = full_url( $_SERVER );
echo $absolute_url;

$url = getUrl( $_SERVER );
echo $url;

所以你必须在你的代码中插入它:

   '0'..'9' corresponds to  0..9
   'a'..'z' corresponds to 10..36
   'A'..'Z' corresponds to 10..36

P.S。在 Linq 的帮助下,你可以提出简洁:

   for (int i=num.Length - 1; i>=0; i--) {
     // actual char, say 'C'
     int c = nums[j];
     // corresponding integer value, 12
     int v = 0;

     if (c >= '0' && c <= '9')
       v = c - '0';
     else if (c >= 'a' && c <= 'z')
       v = c - 'a' + 10; 
     else if (c >= 'A' && c <= 'Z')
       v = c - 'A' + 10; 

     // please, notice not nums[j] but the value it corresponds to - v
     output = output + Math.Pow(mathBase, i) * v;
     ...
   }