将十进制转换为双精度浮点数?

21

我想知道将一个可空类型转换为另一个“兼容”的可空类型的最佳方式是什么(在安全和简洁方面)。

具体而言,从 decimal? 转换为 double? 可以使用以下代码:

public double? ConvertToNullableDouble(decimal? source)
{
    return source.HasValue ? Convert.ToDouble(source) : (double?) null;
}

有没有更好的方法来做这件事?也许利用标准转换可以更好地完成?


你的方法是一个好方法。 - SimpleVar
1
你做得很好!还可以参考这个链接:https://dev59.com/mlXTa4cB1Zd3GeqP4Ln9 - MUG4N
2个回答

39

内置转换大获成功!我刚在VS2012 VS2010中测试过:

 decimal? numberDecimal = new Decimal(5); 
 decimal? nullDecimal = null;
 double? numberDouble = (double?)numberDecimal; // = 5.0
 double? nullDouble = (double?)nullDecimal;     // = null

只使用显式转换将会把 null 转换成 null,同时将内部的十进制值转换为 double。成功!


测试过了,完美运行。谢谢,这正是我在寻找的,但我没有想到内置转换。 - Camilo Martinez
很奇怪,因为在像MUG4N链接的那样的问题中,似乎有很多人有理论,但实际上没有人尝试过。 :) - Avner Shahar-Kashtan
3
事实上,涉及非空值类型源和目标的所有转换都可以“提升为可空”。 - Eric Lippert
@EricLippert 这很奇怪,因为我可以看到对非空类型的显式转换,但看不到隐式转换。 - Avner Shahar-Kashtan
@AvnerShahar-Kashtan:从十进制到双精度的转换是显式的,因此从十进制?到双精度?的转换也是显式的。 - Eric Lippert
1
仅供参考:根据我的经验,它也可以反向工作。我是指将可空的双精度转换为可空的十进制数。 - pholpar

1

通常情况下,如果您想将任何数据类型转换为另一种数据类型,只要它们是兼容的,请使用以下方法:

    Convert.ChangeType(your variable, typeof(datatype you want convert to));

for example:

    string str= "123";
    int value1 = (int)Convert.ChangeType(str, typeof(int));
    float? value2 = (float?)Convert.ChangeType(str, typeof(float));
    ...................................

稍微再加一点,如果您希望它更加安全,可以在其上添加一个try catch:
string str= "123";
try
{
    int value1 = (int)Convert.ChangeType(str, typeof(int));
    int? value2 = (int?)Convert.ChangeType(str, typeof(int));
    float value3 = (float)Convert.ChangeType(str, typeof(float));
    float? value4 = (float?)Convert.ChangeType(str, typeof(float));
}
catch(Exception ex)
{
  // do nothing, or assign a default value
}

这是在VS 2010下测试的。

是的,这是一种更通用的类型转换方式,不像被接受的答案那样简洁。@ Giswin 它对可空类型也适用吗?我想应该可以,但我在文档中没有找到具体评论。 - Camilo Martinez
你可以使用以下代码: decimal? v1 = 222; double? V2 = null; try { V2 = (double?)Convert.ChangeType(v1, typeof(double)); } catch(Exception ex) { // 处理异常 } 但是如果v1为空,Convert.ChangeType会抛出异常,需要通过try catch来处理。 - diwatu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接