安全地自动从双精度转换为十进制:以下是否安全?

Lis*_*isa 5 c# numeric primitive-types

在C#中以下列方式从double转换为十进制是安全的:

int downtimeMinutes = 90;
TimeSpan duration = TimeSpan.FromHours(2d);
decimal calculatedDowntimePercent = duration.TotalMinutes > 0?
    (downtimeMinutes / (decimal)duration.TotalMinutes) * 100.0m : 0.0m;
Run Code Online (Sandbox Code Playgroud)

如果答案是肯定的,那就不用大惊小怪,我只会标记为已接受.

sgt*_*gtz 3

是的,它是安全的,因为十进制具有更高的精度

http://msdn.microsoft.com/en-us/library/364x0z75(VS.80).aspx

编译器将在其他非十进制数字周围进行强制转换,但它们都适合十进制 * (请参阅警告)。

- 警告

  • Decimal 不是浮点类型。它的使命是始终保持精确性。而浮点数,例如 double (我主要使用它)则在精度上进行了权衡以适应非常大的数字)。非常大或非常小的数字不适合小数。所以Lisa需要问自己,运算的幅度是否有可能小于28位有效数字。28 位有效数字足以满足大多数情况。

  • 浮点适用于天文数字大或无限小的数字......或产生足够精度的介于两者之间的运算。我应该查一下,但是 double 可以精确到小数点后几位(最多 7 或 8?),可以精确到正负几十亿。

  • 在科学中,测量超出设备精度的测量是没有意义的。在金融领域,通常逻辑选择是 double,因为在大多数情况下 double 的计算效率更高(有时他们想要更高的准确性,但效率不值得为小数之类的东西而丢弃)。最后,我们都必须务实,将业务需求映射到数字领域。有些工具具有动态数字表示形式。.net 中可能有相同的库。然而,这值得吗?有时是这样。很多时候都是矫枉过正。

  • “它们都适合十进制”不是真的:`Convert.ToDecimal(double.MaxValue)`会抛出`OverflowException` (4认同)