.Net中的零舍入错误类?

Pac*_*ier 2 .net c# vb.net math numbers

大家好,我想知道.Net中是否有一个类用于计算没有舍入误差的精确数字?

例如,这不是我想要的:

decimal dividend = Decimal.One;
decimal divisor = 3;
dividend/divisor * divisor // gives us 0.9999999999999999999999999999 instead of 1
Run Code Online (Sandbox Code Playgroud)

我在想是否有一个数字类缓冲操作,直到我们需要显示它,换句话说它看起来像这样:

Num n = new Num(1);
n.DivideBy(3);
n.MultiplyBy(3);
n.toString(); // gives us "1"

Num n2 = new Num(n);
n2.DivideBy(3);
int decimal_places = 8;
n2.RoundHalfUp(decimal_places);
n2.toString(); // gives us "0.33333333"
Run Code Online (Sandbox Code Playgroud)

当然,这只是一个示例实现.基本上这里的要点是我正在寻找一个没有任何舍入误差的类(通常是通过将计算推迟到最后一刻).

我知道性能会比Double或慢Decimal.但它不必盲目快速地进行计算,只要它在可接受的时间内.

Ale*_* C. 7

这是理性数字的工作.如果你只进行算术运算(包括除法),则无需延迟任何事情.

如果你需要计算任意连续函数(如对数,余弦,平方根等),就成了方式更多地参与.跟踪所需的数字以确保所需的精确度是棘手的,但绝对可行,尽管在实践中效率低下.我们的想法是沿着每个函数存储另一个计算连续性模数的函数(你得到的就是所谓的" 直觉连续函数").

请注意,存储表达式树并不会简化问题,因为您需要评估结果(希望更简单)的表达式.

另一种方法是存储幂级数以及收敛半径,并在请求时计算序列的总和.