我有一个方法:
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) { }
}
}
}
}
答案 0 :(得分:2)
当您使用单一类型对您的号码进行转化时会发生这种情况,其最大值为3.40282347E+38
且nunber的值为1.2676506002282294E+230
,因此您超出Single值类型。一旦你进入双重类型,它的值将为1.2676506002282294E+230
。
从上面链接:
如果浮点运算结果的幅度对于目标格式而言太大,则操作的结果为PositiveInfinity或NegativeInfinity,适用于结果的符号。
答案 1 :(得分:1)
对于双转换,您不会获得无穷大,但是对于浮点转换 在那里你获得Infinity并且没有例外,然后在你进行双重转换之前你的代码会返回。
答案 2 :(得分:0)
溢出条件会导致无穷大;您可以使用以下任一方法检查:
浮动转换会导致您超出数据类型的限制。