C#中Java BigDecimal类的等价物是什么?

时间:2010-05-19 06:44:13

标签: c# java bigdecimal equivalent

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

7 个答案:

答案 0 :(得分:43)

就在最近,我还需要在C#中使用任意精度小数,并且遇到了这里发布的想法:https://stackoverflow.com/a/4524254/804614

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

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

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

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

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

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

答案 1 :(得分:27)

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:4)

这是一个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

列出了其他此类库

答案 4 :(得分: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的程度,可能偶尔会遇到互操作问题,但根据我的经验,它通常适用于这样的简单内容。

答案 5 :(得分:1)

Deveel Math

的GitHub:

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

作者GitHub:

Antonello Provenzano

支持:

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

如何安装

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

PM> Install-Package dmath

答案 6 :(得分:0)

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

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