BigDecimal
是java.math
包中的一个类,它对处理大量特定规模有很多好处。 c#中是否存在具有此功能的等效类或数据类型。
答案 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)
https://github.com/deveel/deveel-math
从NuGet包管理控制台中,选择要安装库的项目,然后键入以下命令
PM> Install-Package dmath
答案 6 :(得分:0)