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年以来一直处于关闭状态。(然后在某个时候又回来了)
- 您可以在找到该网站的存档
- 这里有一份源代码的副本
- 大复合体
- 大十进制
- 大数学
- 理性的
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。