c# - .Net 中的零舍入错误类?

标签 c# .net vb.net math numbers

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

例如,这不是我想要的:

decimal dividend = Decimal.One;
decimal divisor = 3;
dividend/divisor * divisor // gives us 0.9999999999999999999999999999 instead of 1

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

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"

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

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

最佳答案

这是 rational numbers 的工作.如果您只进行算术运算(包括除法),则无需延迟任何操作。

如果您需要计算任意连续函数(例如,对数、余弦、平方根等),它会变得方式更加复杂。跟踪所需的数字以确保要求的精度是棘手的,但绝对可行,尽管在实践中效率低下。这个想法是沿着每个函数存储另一个计算 modulus of continuity 的函数。 (你会得到所谓的“intuitionistic 连续函数”)。

请注意,存储表达式树并不能简化很多事情,因为您需要计算结果(希望更简单)的表达式。

另一种方法是存储幂级数和收敛半径,并在需要时计算级数的总和。

关于c# - .Net 中的零舍入错误类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7931036/

相关文章:

.net - 默认成员(member)提供者的 OnValidatingPassword 是否必须在自定义实现中被覆盖?

c# - 无论目标机器的体系结构如何,如何获取程序文件的路径

c# - 如何声明 "Control implementing interface ISomething"类型的变量/参数?

c# - 从字节数组转换为字符串十六进制 C#

c# - 这个条件在sql里怎么写?

c# - 格式化用户输入的货币

sql - VB.net 中的 Datatable.Select 和 Like

vb.net - Microsoft Office PIA 以及如何从 WebApp 正确引用和构建

c# - CA2221 : Finalizers should be protected

c# - 使用 jquery ajax 将文件上传到跨域 WCF 服务