BigDecimal
是java.math
包中的一个类,对于处理一定规模的大量数据有很多好处。c# 中是否有具有此功能的等效类或数据类型。
7 回答
就在最近,我还需要 C# 中的任意精度小数,并在此处发布了这个想法:https ://stackoverflow.com/a/4524254/804614
然后,我完成了支持所有基本算术和比较运算符的草案,以及与所有典型数值类型和一些指数方法之间的转换,这是我当时需要的。
它当然不全面,但非常实用且几乎可以立即使用。由于这是一晚编码的结果,我不能保证这个东西没有错误或完全准确,但它对我来说非常有用。无论如何,我想在这里发布它,因为我没有找到任何其他方法可以在 C# 中使用任意精度小数,而无需包含大量库(大多数甚至不是 .net,而是 C++ 的包装器),这些库带有各种不必要的东西。
基本思想是使用 .NET 4.0 的 BigInteger 类型和以 10 为底的指数 (Int32) 构建具有任意大尾数的自定义浮点类型。
如果您发现错误/不准确之处、有建议或任何建设性内容,请随时直接编辑我的帖子或发表评论,以便我改进答案。
我不完全确定这是否是放置这个东西的最佳地点,但这是关于这个主题的最重要的问题之一,我真的想分享我的解决方案。;)
编辑:我将实现移至 GitHubGist:https ://gist.github.com/JcBernack/0b4eef59ca97ee931a2f45542b9ff06d
C# 仅BigInteger
构建了它(在 .NET 框架 4 中)。
您的任务是否有decimal
足够的精度?它是一个 128 位数字,可以保存 ±1.0 × 10 -28到 ±7.9 × 10 28范围内的值。
有一个名为 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上有其他此类库的列表
资料来源:
- BigNum 库最初托管在http://www.fractal-landscapes.co.uk/bigint.html,但该站点自 2012 年以来一直处于关闭状态。(然后在某个时候又恢复了)。
- 您可以在http://web.archive.org/web/20110721173046/http://www.fractal-landscapes.co.uk/bigint.html找到该网站的存档。
- 在http://www.mediafire.com/file/6axoicc6iszp4sg/BigNum.zip/file有源代码的副本
好吧,除了使用支持 BigDecimal(如果存在)的第三方库之外,没有简单的解决方法。就我而言,最简单的方法是采用十进制实现(例如从单声道)并使用 BigInteger 类型重写它。在内部,在 mono 的实现中,十进制类型由三个整数组成。所以我认为这并不难实现。我不确定效率。但是,您应该首先考虑使用codeka提到的标准十进制类型。
发展数学
GitHub:
https://github.com/deveel/deveel-math
作者 GitHub:
支持:
- 大综合体
- 大十进制
- 大数学
- 合理的
- ...
如何安装
在 NuGet 包管理控制台中,选择将安装库的项目并键入以下命令
PM> Install-Package dmath
最初发布问题时,这可能不是一个选项,但是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 的程度,偶尔可能会遇到互操作问题,但根据我的经验,它通常适用于像这样的简单事情。