1

私は方法を持っています:

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) { }
            }
        }
    }
}
4

3 に答える 3

2

これは、最大値が の単一タイプで数値の変換を実行すると発生し、3.40282347E+38数値の値が単一値タイプ1.2676506002282294E+230を超えているためです。ダブルタイプになると価値が出てきます。1.2676506002282294E+230

上記のリンクから:

浮動小数点演算の結果の大きさが目的の形式に対して大きすぎる場合、演算の結果は、結果の符号に応じて、PositiveInfinity または NegativeInfinity になります。

于 2012-07-01T05:39:08.907 に答える
1

double 変換では無限ではなく、float 変換では得られます。
Infinity が得られ、例外はなく、二重変換に到達する前にコードが返されます。

于 2012-07-01T05:39:53.207 に答える
0

オーバーフロー条件は無限大を引き起こします。これは、次のいずれかで確認できます。

float 変換により、データ型の制限を超えています。

于 2012-07-01T05:42:57.667 に答える