C#转换为double返回无穷大

时间:2012-07-01 05:26:28

标签: c# double converter infinity typedescriptor

我有一个方法:

public void StoreNumberInSmallestType(ValueType number)
{
    if (numberTypes == null)
        numberTypes = new List<Type>() { typeof(sbyte), typeof(short), typeof(int), typeof(long), typeof(float), typeof(double) };

    foreach (Type t in numberTypes)
    {
        try
        {
            var converter = TypeDescriptor.GetConverter(t);
            value = converter.ConvertTo(number, t);

            Type = value.GetType();

            return;
        }

        catch (OverflowException) { }
    }
}

该方法位于一个类中,其中变量value定义为dynamic

当像这样使用时:

StoreNumberInSmallestType(Math.Pow(200, 100));

value最终成为Infinity。如果我逐步完成整个过程,我发现number的值不是Infinity,而是以科学记数法表示的结果。每当number被转换并存储在value内时,就会发生一些不好的事情。有人知道为什么number保留了正确的值,但value没有?

编辑:

以下是完整的代码示例:

主:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Class1 c1 = new Class1();
            c1.StoreNumberInSmallestType(Math.Pow(200, 100));
        }
    }
}

类别:

namespace ConsoleApplication1
{
    public class Class1
    {
        List<Type> numberTypes;
        dynamic value;
        public Type Type { get; set; }

        public void StoreNumberInSmallestType(ValueType number)
        {
            if (numberTypes == null)
                numberTypes = new List<Type>() { typeof(sbyte), typeof(short), typeof(int), typeof(long), typeof(float), typeof(double) };

            foreach (Type t in numberTypes)
            {
                try
                {
                    var converter = TypeDescriptor.GetConverter(t);
                    value = converter.ConvertTo(number, t);

                    Type = value.GetType();

                    return;
                }

                catch (OverflowException) { }
            }
        }
    }
}

3 个答案:

答案 0 :(得分:2)

当您使用单一类型对您的号码进行转化时会发生这种情况,其最大值为3.40282347E+38且nunber的值为1.2676506002282294E+230,因此您超出Single值类型。一旦你进入双重类型,它的值将为1.2676506002282294E+230

从上面链接:

  

如果浮点运算结果的幅度对于目标格式而言太大,则操作的结果为PositiveInfinity或NegativeInfinity,适用于结果的符号。

答案 1 :(得分:1)

对于双转换,您不会获得无穷大,但是对于浮点转换 在那里你获得Infinity并且没有例外,然后在你进行双重转换之前你的代码会返回。

答案 2 :(得分:0)

溢出条件会导致无穷大;您可以使用以下任一方法检查:

浮动转换会导致您超出数据类型的限制。