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

28

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

编辑: 我正在使用 System.Decimal。我的问题是 System.Math 不能与 System.Decimal 一起使用。例如,以下函数不能与 System.Decimal 一起使用:

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

1
你能定义标准的数学函数吗? - Chris Shouts
十进制类型呢? - Bala R
你在使用哪些数学函数,能分享一下吗?我们是在讨论 Floor 和 Ceil 吗?还是其他的函数? - Brad Christie
在您看来,“十进制数”是什么? - TonyK
1
这个问题非常模糊。你需要知道什么? - Dykam
显示剩余4条评论
3个回答

19

嗯,Double使用的是浮点数数学,除非你正在进行三维图形的三角函数计算之类的操作,否则不适用。

如果你需要进行简单的数学运算,比如除法,那么应该使用System.Decimal

根据MSDN:decimal关键字表示128位数据类型。与浮点类型相比,decimal类型具有更高的精度和更小的范围,因此适用于金融和货币计算。

更新:经过一些讨论,问题在于您想使用Decimal进行计算,但System.Math仅接受Double进行几个关键功能的计算。不幸的是,您正在处理高精度数字,而由于Decimal是128位,而Double只有64位,所以转换会导致精度损失。

显然,有一些可能的计划使大多数System.Math处理Decimal,但我们还没有到达那里。

我在网上搜索了一些数学库,并编制了这个列表:

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

  2. Extreme Optimization Mathematics Library for .NET(付费)

  3. DecimalMath是一个相对较新的库,它将自己宣传为:支持Microsoft忘记的Decimal和更多的便携式数学支持。听起来很有前途。


我正在尝试使用System.Decimal,但它与System.Math不兼容。 - LunchMarble
1
对于算术运算,使用 Decimal,当需要执行 System.Math.Log 时,将其转换为 Double,然后再转回来。 - Brian MacKay
1
@Storm Kiernan:你肯定需要一个第三方库。显然,这应该最终进入框架,但现在还没有。我正在谷歌上搜索它。有一些C库,也许有一个C#的包装器。 - Brian MacKay
1
@JeffBridgman 不确定这里的协议是什么,但为了解决这个问题,我引入了那个被删除问题中的相关内容,并尽力给予适当的认可。感谢您的提醒。 - Brian MacKay
1
@RBarryYoung 谢谢 - 已确认并更新。我也看了下 Ramin 在下面提到的那个,看起来值得一试。 - Brian MacKay
显示剩余5条评论

14

DecimalMath 包含了 System.Math 类中所有函数,但参数类型为 decimal

注意:这是我的库,里面还包含了一些示例。


2
如果你要推广自己的库,请说明一下来源,说明你是编写者。我觉得你一定是编写者,因为GitHub用户名与stackoverflow用户名匹配。同时,提供如何实现问题描述的例子会比仅仅提供库链接更有帮助。 - bcsb1001
是的,这是我的库,我为自己的需求开发并共享它,我使用每个函数的泰勒级数和其他一些技巧重写了Math库,我的意思是所有示例都与Math类相同,因此不需要额外的示例, 但是可能是我的疏忽没有透露它是我的。 - Ramin Rahimzada
我真的很喜欢这个。 - FranzHuber23

8
你没有给我们足够的信息来回答这个问题。
十进制和双精度都不准确。当被表示的数量恰好等于形如(x/10^n)的分数时,十进制的表示误差,其中x和n的选择合适。当数量恰好等于(x/2^n)的分数时,双精度的表示误差为零,同样是对于合适的x和n的选择。
如果你处理的量不是那种形式的分数,那么你将得到一些表示误差,无论如何。特别是,你提到了取平方根。许多平方根都是无理数;它们没有分数形式,因此任何使用分数的表示格式都会产生小的误差。
你能详细解释一下你正在做什么吗?

5
-1 我认为问题提供了足够的信息。他正在使用小数,并且希望在计算中使用内置的.NET类操作,但它们只接受双精度浮点数。 - contactmatt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接