C#支持二进制浮点类型(Double
和Single
)的无穷大数学(参见:Express mathematical infinity in C#),但不支持Decimal.
我喜欢Decimal
}它提供的精度类型,但我也需要支持无限数学(详见下文)。
是否有一种“懒惰”方式来创建InfinityDecimal
结构,增加对-Inf / + Inf / NaN的支持,就像Nullable
通用结构添加对Nullable
类型的支持一样?也许有一些有趣的属性可能适用?一个包含这样一个野兽的现有数学库?
否则我应该创建一个具有Decimal
value
属性的类或结构,并显式实现struct Decimal
类型的每个公共方法,返回等效的结果{{ 1}}操作,除非操作数是,或结果应该是+/- Inf或NaN。
正确?
Decimal
答案 0 :(得分:4)
如果您查看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
被添加到模型货币中并尽可能精确地避免舍入误差和损失金钱:)。在“钱”这个概念中,无穷大没有多大意义。 :)
实现你想要的其余部分是有效的比较......