使用C#中的System.Decimal进行数学运算

时间:2011-05-04 18:44:09

标签: c# math decimal

需要能够在十进制数字上使用标准数学函数。准确度非常重要double不是可接受的替代品。如何用C#中的十进制数来实现数学运算?

修改 我正在使用System.Decimal。我的问题是System.Math不适用于System.Decimal。例如,以下功能不适用于System.Decimal

  • System.Math.Pow
  • System.Math.Log
  • System.Math.Sqrt

4 个答案:

答案 0 :(得分:14)

好吧,Double使用floating point数学,这不是你所追求的,除非你正在为3D图形做三角测量。

如果您需要进行简单的数学运算,例如除法,则应使用System.Decimal

来自MSDN: decimal关键字表示128位数据类型。与浮点类型相比,十进制类型具有更高的精度和更小的范围,这使其适用于财务和货币计算。

更新:经过一番讨论后,问题是您想要使用Decimals,但System.Math只需要使用Doubles来完成几个关键功能。遗憾的是,您使用的是高精度数字,由于Decimal为128位而Double为64,因此转换会导致精度下降。

显然有一些可能的计划使System.Math的大部分处理Decimal,但我们还没有。

我搜索了一些数学库,我终于找到了一个现已删除的StackOverflow问题,其中TheVillageIdiot提到了以下库:

1)Mathdotnet,一个用C#/。Net编写的数学开源(MIT / X11,LGPL& GPL)库,旨在为符号代数和数值/科学计算提供一个独立的清晰框架。

2)IMSL™ C# Numerical Library for Microsoft® .NET Applications(付费)

3)Extreme Optimization Mathematics Library for .NET

答案 1 :(得分:7)

你没有给我们足够的信息来回答这个问题。

decimal和double都是不准确的。当表示的数量恰好等于形式的一小部分(x / 10 n )时,小数的表示错误 0 选择x和n。对于x和n的合适选择,当数量恰好等于形式的一部分(x / 2 n )时,双精度的表示误差为零。

如果您处理的数量不是该形式的分数,那么您将得到一些表示错误,句点。特别是,你提到了平方根。许多平方根都是无理数;它们没有小数形式,因此任何使用分数的表示格式都会产生很小的错误。

你能更详细地解释一下你在做什么吗?

答案 2 :(得分:4)

DecimalMath包含System.Math类中decimal参数类比的所有函数

注意:它是我的库,还包含一些示例

答案 3 :(得分:-2)

使用十进制数据类型,它具有128位精度:

http://msdn.microsoft.com/en-us/library/364x0z75(v=vs.80).aspx