C# 支持二进制浮点类型(Double
和 Single
)的无穷数学(参见:Express mathematical infinity in C#),但不支持 Decimal。
我喜欢 Decimal
类型,因为它提供的精度,但我也需要对无穷数学的支持(详情如下)。
是否有一种“惰性”方式来创建一个添加对 -Inf/+Inf/NaN 支持的 InfinityDecimal
结构,就像 Nullable
通用结构添加对可空
类型?也许有一些有趣的属性使用可能适用?包含这样一个野兽的现有数学库?
否则,我应该创建一个具有Decimal
value
属性的类或结构,并显式实现struct Decimal
的每个公共(public)方法类型,返回等效 Decimal
操作的结果,除非操作数是,或者结果应该是 +/-Inf 或 NaN。
对吧?
+INF + N = +INF (where –INF < N < INF)
-INF + N = -INF (where –INF < N < INF)
+INF + +INF = +INF
-INF - +INF = -INF
+INF - +INF = NAN
+INF * +INF = +INF
+INF * -INF = -INF
-INF * -INF = +INF
+INF / +INF = NAN
-INF / -INF = NAN
-INF / +INF = NAN
+INF / -INF = NAN
+INF / 0 = +INF
-INF / 0 = -INF
+INF / N = +INF (where 0 < N < INF)
最佳答案
如果您查看 Double
和 Single
的作用,它们基本上会保留一个值来表示正无穷大和负无穷大。该值基本上接近于在每种类型中合理可能表示的正无穷大和负无穷大。根据推论,这是 1 除以非零的最小值(即 Epsilon
)。当然,Decimal
没有 Epsilon
属性。您可以通过创建一个非常接近于零而不是零的值来创建您自己的 epsilon 值:
var DecimalEpsilon = new decimal(1,0,0,false,27);
有效 0.000000000000000000000000001m
。
然后您可以像 Single 和 Double 一样创建正无穷大和负无穷大:
var DecimalPositiveInfinity = 1m / DecimalEpislon;
var DecimalNegativeInfinity = -1m / DecimalEpislon;
不幸的是,您必须自己处理 decimalValue/zeroValue
并自己包装 DivideByZeroException 并返回适当的无穷大常量——这实际上意味着包装所有除法。 NaN 可能也是如此,因为这也不是 Decimal
概念(在 Single
/Double
中建模为 PositiveInfinity/PositiveInfinity
。
Decimal
被添加到货币模型中,并尽可能精确以避免舍入错误和金钱损失 :)。在“钱”的概念里,无限没有多大意义。 :)
实现你想要的其余部分是有效的比较......
关于c# - 将无穷大数学行为添加到 Decimal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20250188/