为什么楠(不是数字)只能用于双打?

我有一个业务类,包含两个可为空的十进制属性。 第三个属性返回乘以另外两个属性的结果。 如果HasValue对于两个可为空的types是真的,那么我乘并返回结果。 如果其中一个或两个属性为空,我有几个返回值的选项:

  • 返回0
  • 抛出exception
  • 返回一个幻数(-1)
  • 返回小数? (编辑 – 见评论)

我认为我的select之一是返回NaN,但我看到这只适用于双重types。 为什么是这样?

为了logging,在这种情况下返回0是最有意义的,这是我打算做的,除非有人有更好的build议。

.NET中的整型使用二进制补码来表示。 虽然他们可以保留一些特殊的价值模式,但他们select不这样做。 doublefloat使用一个完全不同的表示系统(IEEE 754),它为NaN,+ Infinity,-Infinity,…保留了一些特殊的位模式。

NaN和Infinity值对于浮点运算更有意义的一个原因是操作可能导致除以零,不仅因为除数实际上是零,而且因为它太小而不能被types表示。 结果,如果不是这样的话,你可以有一个有效的计算神秘地抛出一个除以零的例外。 这不会发生inttypes,因为它们是确切的,没有精度错误。

decimal被devise为用于“真实世界”的十进制浮点数。 这很less受制于doublefloat计算。 NaN表示真实世界的号码是什么?

仅仅留下原因,就是这样,我们无能为力,所以最好的路线是使用可空types(它们旨在帮助确切地处理这种情况)。 这是解决这个问题的正确方法 。 如果你不想那么做(而且例外是没有意义的),你应该诉诸魔术数字解决scheme。 如果您select这样做,只要确保它在有效结果的域外。

编辑(十进制常见的误解):

同样MSDN也注意到 , decimal不是固定点。 这是一个浮点数:

十进制数是一个浮点值,它由一个符号,一个数值(其中数值范围从0到9)和一个缩放因子组成,这些缩放因子指示分隔整数部分和小数部分的浮点小数点的位置的数值。

要解决NAN&Infinity使用这个

 if (Double.IsNaN(YourValue) || Double.IsInfinity(YourValue)) { YourValue = 0; }