2010-05-19 147 views
38

BigDecimaljava.math包中的一个类,它具有处理大量特定比例的许多好处。使用此功能的c#中是否有等效的类或数据类型?什么是C#中的Java BigDecimal类的等价物?

+0

可能的重复[是否有C#中的BigFloat类?](http://stackoverflow.com/questions/10359372/is-there-a-bigfloat-class-in-c) – 2016-09-13 15:06:51

回答

25

C#只有BigInteger构建它(在.NET框架4中)。

decimal足够的精度为您的任务?它是一个128位的数字,可以保存的值在±1.0×10 -28至±7.9×10 。

+4

BigRational类也在它的方式。目前正在测试中。 – 2012-08-08 20:57:04

+0

@RaheelKhan你是指这个? https://msdn.microsoft.com/de-de/library/microsoft.solverfoundation.common.rational(v=vs.93).aspx – 2017-06-04 08:58:22

+0

@JanusTroelsen不,他的意思是http://bcl.codeplex.com/发布/查看/ 42782 – MrCC 2018-01-13 18:36:42

4

那么,除了使用支持BigDecimal的第三方库(如果存在的话)之外,没有简单的解决方法。就我而言,最简单的方法是取一个十进制实现(例如单声道)并使用BigInteger类型重写它。在内部,在mono的实现中,十进制类型由三个整数组成。所以我认为这不会很难实施。虽然我不确定效率。但应首先考虑使用标准十进制类型codeka提到。

3

下面是一个C#库,它可以完成您正在寻找的任务,并且在某些情况下还具有其他功能:http://www.fractal-landscapes.co.uk/bigint.html(或尝试在http://web.archive.org/web/20110721173046/http://www.fractal-landscapes.co.uk/bigint.html)。

例如,它有一个平方根函数,该函数的BigDecimal没有:

PrecisionSpec precision = new PrecisionSpec(1024, PrecisionSpec.BaseType.BIN); 
BigFloat bf = new BigFloat(13, precision); 
bf.Sqrt(); 
Console.WriteLine(bf.ToString()); 

维基百科在http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic#Libraries

+0

404:库不再可用? – Shlomo 2012-07-10 01:56:54

+0

添加了archive.org链接。 – RedGreenCode 2012-09-03 21:16:32

+0

链接已死,archive.org不保留源代码zip文件。 – kristianp 2012-09-08 09:32:14

36

其他此类库的名单就在最近,我还需要一个任意精度在C#中使用十进制数字,并发现在这里发布的想法:https://stackoverflow.com/a/4524254/804614

然后我完成了草案,以支持所有基本的算术和比较运算符,以及所有典型数值ical类型和一些指数方法,这是我当时需要的。

它当然不全面,但功能非常强大,几乎可以立即使用。由于这是一个晚上编码的结果,我不能保证这个东西没有缺陷或完全确切,但它对我很好。无论如何,我想在这里发布它,因为我没有发现任何其他方式在C#中使用任意精度小数,而不需要包含大量的库(大多数甚至不包括.net,但是包装到C++),这些库包含各种不必要的东东。

基本思想是使用.NET 4.0的BigInteger类型和基本10指数(Int32)构建任意大型尾数的自定义浮点类型。

如果您发现错误/不准确,有建议或任何建设性的,请随时直接编辑我的文章或留下评论,以便我可以改善答案。

我不完全确定这是否是放置此事的最佳位置,但这是关于此主题的最重要的问题之一,我非常想分享我的解决方案。;)

编辑:我提出的实施GitHubGist:https://gist.github.com/JcBernack/0b4eef59ca97ee931a2f45542b9ff06d

+0

出色的工作!这对我的PI计算努力来说非常方便。 – vbocan 2013-02-21 09:49:07

+0

这很好。我可能提出的一个建议不是否定一元'-'运算符中的尾数,而是为了不可变性返回一个带有否定尾数的新BigDecimal。否则,您可能会发现'BigDecimal x = 1.01,y = -x'具有'x == y == -1.01'的不良效果。 – jimbobmcgee 2014-11-27 18:47:47

+2

@jimbobmcgee首先,我认为你是对的,并且已经在编辑答案,但后来我又意识到'BigDecimal'是一个结构体。这意味着进入一元运算符的论据已经是原始文件的副本,这使得不可能意外修改它。 – Gigo 2014-11-28 17:25:49

1

Deveel数学

GitHub上:

https://github.com/deveel/deveel-math

作者GitHub上:

Antonello Provenzano

支持:

  • BigComplex
  • 的BigDecimal
  • BigMath
  • 理性
  • ...

如何安装它

从NuGet包管理控制台中,选择图书馆将安装的项目然后键入以下命令

PM> Install-Package dmath 
+0

我不会相信这个图书馆。我有一些情况,其中一个添加失败,出现“10的权力太大”的错误以及另一个使用BigDecimal的情况,其中0.5> 1e-20返回false – 2016-09-30 13:00:08

+0

优秀的库 – user1018697 2017-12-20 14:36:27

2

这可能不是一个选项,当这个问题最初发布,但在你的C#代码使用BigDecimal一个非常简单的方法是通过的NuGet安装IKVM.NET包:

PM> Install-Package IKVM 

然后做完全按照您在Java将:

using System; 
using java.math; 

namespace BigDecimalDemo 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int n = int.Parse(args[0]); 
      Console.WriteLine(Factorial(n)); 
     } 

     static BigDecimal Factorial(int n) 
     { 
      return n == 1 
       ? BigDecimal.ONE 
       : Factorial(n - 1).multiply(new BigDecimal(n)); 
     } 
    } 
} 

根据你走多远与IKVM可以有偶尔的互操作问题偶然发现,但以我的经验来看,它对于这样简单的东西通常效果很好。

+0

IKVM是将java代码引入C#项目的好工具,但为了引入一个相对简单的类,将整个Java类库添加到您的项目中似乎过分了。 – Sprotty 2017-01-25 12:43:39

相关问题