59

BigDecimaljava.math包中的一个类,对于处理一定规模的大量数据有很多好处。c# 中是否有具有此功能的等效类或数据类型。

4

7 回答 7

44

就在最近,我还需要 C# 中的任意精度小数,并在此处发布了这个想法:https ://stackoverflow.com/a/4524254/804614

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

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

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

如果您发现错误/不准确之处、有建议或任何建设性内容,请随时直接编辑我的帖子或发表评论,以便我改进答案。

我不完全确定这是否是放置这个东西的最佳地点,但这是关于这个主题的最重要的问题之一,我真的想分享我的解决方案。;)

编辑:我将实现移至 GitHubGist:https ://gist.github.com/JcBernack/0b4eef59ca97ee931a2f45542b9ff06d

于 2012-12-11T04:16:35.813 回答
37

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

您的任务是否有decimal足够的精度?它是一个 128 位数字,可以保存 ±1.0 × 10 -28到 ±7.9 × 10 28范围内的值。

于 2010-05-19T06:48:22.347 回答
5

有一个名为 BigNum 的 C# 库可以满足您的需求,并且在某些情况下还具有其他功能。

例如,它有一个平方根函数,而 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上有其他此类库的列表

资料来源:

于 2011-05-29T04:02:37.600 回答
4

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

于 2010-05-19T07:29:16.607 回答
3

发展数学

GitHub:

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

作者 GitHub:

安东内洛·普罗文扎诺

支持:

  • 大综合体
  • 大十进制
  • 大数学
  • 合理的
  • ...

如何安装

在 NuGet 包管理控制台中,选择将安装库的项目并键入以下命令

PM> Install-Package dmath
于 2015-12-02T09:04:21.823 回答
2

最初发布问题时,这可能不是一个选项,但是BigDecimal在 C# 代码中使用 a 的一种非常简单的方法是通过 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 的程度,偶尔可能会遇到互操作问题,但根据我的经验,它通常适用于像这样的简单事情。

于 2016-01-13T04:45:38.823 回答
0

您还可以使用我编写的Math.Gmp.Native NuGet 包。其源代码可在GitHub 上获得,文档可在此处获得。它向 .NET 公开了GMP库的所有功能,该库被称为高度优化的任意精度算术库。

任意精度浮点数由mpf_t类型表示。这些浮点数的运算都以mpf_前缀开头。例如,mpf_addmpf_cmp。每个操作都给出了源代码示例。

于 2019-05-18T09:31:01.827 回答