将double转换为十进制或从double构造"new"小数更好吗?

Mat*_*hew 27 .net c# double casting decimal

当从一个双精度变为十进制时,假设我double 可以表示为decimal...

它是更合适的投双为十进制:
(显式数值转换表)(请注意,此项错误地违背了前者!)

double foo = bar;
decimal foobar = (decimal)foo;
Run Code Online (Sandbox Code Playgroud)

或者更适合调用decimal构造函数:
(Decimal Constructor)

double foo = bar;
decimal foobar = new decimal(foo);
Run Code Online (Sandbox Code Playgroud)

我倾向于使用decimal构造函数,但我想知道使用一个与另一个的原因.

从我可以告诉我唯一的区别是,下面的双重显式转换Decimal.MinValue返回零,而使用构造函数抛出一个OverflowException

编辑: @Joren在下面的评论中指出,演员OverflowException也会抛出一个小值...所以显然MSDN文档是不正确的.

相关问题:
- C#将双变量强制转换为十进制
- 安全地自动从双精度转换为十进制:以下是否安全?

Ran*_*832 18

真的没什么区别.使用ILSpy:

// decimal
public static explicit operator decimal(double value)
{
    return new decimal(value);
}
Run Code Online (Sandbox Code Playgroud)

在使用LINQPad检查IL的基础上,在C#中的已检查和未检查的上下文中,操作符重载的调用方式相同.

在Visual Basic中,CDec([double])和CType([double],Decimal)直接调用构造函数,因此在这方面没有区别,但是强制转换器比构造函数更能参与编译时常量折叠.


GET*_*Tah 12

我宁愿去构造函数呢!至少你会被告知你的价值超出限制而不是默默地设置为0 !文件说:

显式数字转换可能会导致精度损失或导致抛出异常.

如果一个人真的不关心精确度而不是铸造可以使用.另一方面,如果你正在玩钱,例如,你要做的最后一件事就是完成双打!您不希望应用程序将有价值的小数部分转换为0,而您不希望它这样做.


小智 5

编辑:请参阅Joren对主帖的评论.即使 在LINQPad 4(C#4/.NET4)中,这仍然会引发异常unchecked.


另一种选择是使用checked(假设unchecked上下文另有说明):

double d = double.MaxValue;
decimal f = checked((decimal)d);
Run Code Online (Sandbox Code Playgroud)

结果如下:

OverflowException:对于Decimal,值太大或太小.

然而,在一天结束时,我认为这个问题"不是一个真正的问题",因为使用哪种方法主要不取决于[预期]输入,而是溢出时应该发生什么.

快乐的编码.