当从一个小数字变为小数时,假设我的double
可以表示为decimal
......
将双精度值转换为十进制更合适:
(Explicit Numeric Conversions Table)(请注意,此条目错误地与前者相矛盾!)
double foo = bar;
decimal foobar = (decimal)foo;
或者更适合调用decimal
构造函数:
(Decimal Constructor)
double foo = bar;
decimal foobar = new decimal(foo);
我倾向于使用decimal
构造函数,但我想知道使用一个与另一个的原因。
从我所知道的唯一区别是, Decimal.MinValue
下方的双重显式转换返回零,而使用构造函数抛出OverflowException
编辑: @Joren在下面的评论中指出,演员也会为小值抛出OverflowException
...所以显然MSDN文档不正确。
相关问题:
- C# cast a double variable to decimal
- Automatically cast from double to decimal safely: Is the following safe?
答案 0 :(得分:18)
真的没什么区别。使用ILSpy:
// decimal
public static explicit operator decimal(double value)
{
return new decimal(value);
}
基于使用LINQPad检查IL,运算符重载在C#中的已检查和未检查上下文中以相同方式调用。
在Visual Basic中,CDec([double])和CType([double],Decimal)直接调用构造函数,因此在这方面没有区别,但是强制转换更能参与编译时常量折叠而不是构造函数。
答案 1 :(得分:12)
我宁愿去构造函数呢!至少你会被告知你的价值超出限制,而不是将其设置为0 默默! 文档说:
显式数字转换可能会导致精度或结果丢失 抛出异常。
如果一个人真的不关心精确度,那么可以使用铸造。另一方面,如果你正在玩钱,例如,你要做的最后一件事就是完成双打!您不希望您的应用程序将有价值的小数部分转换为0,而您不希望它这样做。
答案 2 :(得分:5)
编辑:请参阅Joren对主帖的评论。这仍然会在LINQPad 4(C#4 / .NET4)中引发异常,即使 unchecked
。
另一个选择是使用checked
(否则假设unchecked
上下文):
double d = double.MaxValue;
decimal f = checked((decimal)d);
结果是:
OverflowException:对于Decimal,值太大或太小。
然而,在一天结束时,我认为这个问题“不是一个真正的问题”,因为使用哪种方法主要不取决于[预期]输入,而是应该发生什么溢出
快乐的编码。
答案 3 :(得分:3)
我会使用构造函数,因为由于精度的不同,该转换可能会产生意外的结果。构造函数更愿意处理转换似乎是合乎逻辑的。
如您的问题中所述,在某些情况下,从double转换为十进制将导致OverflowException
,这可能需要在您的代码中进行一些特殊处理。 Casting忽略了这个异常,如果精度至关重要,这可能是不可取的。
答案 4 :(得分:1)
可以这样试试:
double v = 2.33;
decimal b;
if (decimal.TryParse(v.ToString(), out b))
//do this
else
//do that