Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中Java BigDecimal类的等价物是什么?_C#_Java_Bigdecimal_Equivalent - Fatal编程技术网

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

C#中Java BigDecimal类的等价物是什么?,c#,java,bigdecimal,equivalent,C#,Java,Bigdecimal,Equivalent,BigDecimal是java.math包中的一个类,它对于处理一定规模的大数字有很多好处。c#中是否有具有此功能的等效类或数据类型。c#只在.NET framework 4中构建了BigInteger decimal对于您的任务是否足够精确?它是一个128位的数字,可以保存±1.0×10范围内的值−28到±7.9×1028。除了使用支持BigDecimal的第三方库(如果存在),没有简单的解决方法。就我而言,最简单的方法是采用十进制实现(例如来自mono)并使用BigInteger类型重写它。

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

c#只在.NET framework 4中构建了
BigInteger


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

除了使用支持BigDecimal的第三方库(如果存在),没有简单的解决方法。就我而言,最简单的方法是采用十进制实现(例如来自mono)并使用BigInteger类型重写它。在mono的内部实现中,decimal类型由三个整数组成。所以我认为这并不难实现。不过,我对效率没有把握。然而,你首先应该考虑使用标准的十进制类型作为<强> > CordkA<强>。

< P>有一个称为BigNUM的C库,它可以做你正在寻找的,并且在某些情况下有附加的功能。 例如,它有一个平方根函数,BigDecimal没有:

PrecisionSpec precision = new PrecisionSpec(1024, PrecisionSpec.BaseType.BIN);
BigFloat bf = new BigFloat(13, precision);
bf.Sqrt();
Console.WriteLine(bf.ToString());
维基百科网站上还有其他类似图书馆的列表

资料来源:

  • BigNum库最初托管于,但该站点自2012年以来一直处于关闭状态。(然后在某个时候又回来了)
  • 您可以在找到该网站的存档
  • 这里有一份源代码的副本

就在最近,我还需要一个C#中的任意精度小数,并在这里找到了这个想法:

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

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

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

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

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

编辑:我将实现移动到GitHubGist:

Deveel-Math github:

作者:GitHub:

支持:
  • 大复合体
  • 大十进制
  • 大数学
  • 理性的
如何安装 从NuGet软件包管理控制台中,选择要安装库的项目,并键入以下命令

PM> Install-Package dmath

在最初发布问题时,这可能不是一个选项,但在C代码中使用
BigDecimal
的一个非常简单的方法是通过NuGet安装程序包:

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的发展程度,偶尔会出现互操作问题,但根据我的经验,它通常对这样简单的东西非常有用。

您也可以使用我编写的NuGet软件包。其源代码可在上获得,并提供文档。它向.NET公开了该库的所有功能,该库被称为高度优化的任意精度算术库


任意精度浮点数由类型表示。对这些浮点数的操作都以
mpf\uu
前缀开始。例如,或。每个操作都给出了源代码示例。

404:库不再可用?链接已失效,而archive.org无法保存源代码zip文件。请有人为此重新加载原始代码吗?@Rasheed I向包含源代码的zip文件添加了一个链接。第一个链接不再失效。:)与归档版本的布局稍有不同,但无论如何都是同一个时代。BigRational类也正在开发中。目前处于测试阶段。@RaheelKhan你是说这个吗?干得好!这对我的圆周率计算很有用。这很好。我可能提出的一个建议是,不要对一元
-
运算符中的尾数求反,而是返回一个新的
BigDecimal
,并带有求反的尾数,以实现不可变。否则,您可能会发现
BigDecimal x=1.01,y=-x
具有
x==y=-1.01
@jimbobmcgee的不良效果。起初我认为您是对的,并且已经在编辑答案,但后来我再次意识到
BigDecimal
是一个结构。这意味着一元运算符中的参数已经是原始参数的副本,因此不可能意外修改它。@Gigo-注意并接受。快速
BigDecimal one=新的BigDecimal(1,0);BigDecimal minusOne=-1;(新的{1,minusOne}).Dump(“否定?”)确认它。很高兴今天能学到新东西!我在我们的解决方案中使用了这个函数,我注意到除法几乎需要500毫秒,这主要是因为NumberOfDigits函数。将其转换为字符串相当耗时。我将该函数的主体替换为:
return(int)Math.天花(biginger.Log10(value*value.Sign))我不信任此库的可能副本。我遇到过一些加法失败的情况,错误是“10的幂太大”,还有一种情况是使用BigDecimal,其中0。