简体   繁体   English

如何在C#中获得超过100个十进制数字?

[英]How can I get more than 100 decimal digits in C#?

Is it possible to get more than 100 decimal digits in C#? 是否有可能在C#中获得超过100个十进制数字?

If yes what is the necessary portion of code? 如果是,那么代码的必要部分是什么?

In Java there something call BigDecimal but it still can't reach more than 55 digits. 在Java中有一些东西叫BigDecimal但它仍然不能超过55位。

Using J# libraries: 使用J#库:

Download the J# Redistributable to obtain the J# class libraries. 下载J# Redistributable以获取J#类库。 This article hints about how to use it to get ZIP-ability in your .NET projects, and explains a bit about BigDecimal, but as Ramhound explained, the article is relatively old. 本文提示如何使用它来获取.NET项目中的ZIP功能,并解释一下BigDecimal,但正如Ramhound所解释的那样,这篇文章相对较旧。

After download, add the vsjlib to your project. 下载后,将vsjlib添加到项目中。 It didn't work for me on .NET 4.0, but it did work on 2.0 project. 它在.NET 4.0上对我不起作用,但它确实适用于2.0项目。 It contains a BigDecimal class, among others. 它包含一个BigDecimal类。 Not sure, however, if that gives you up to 100 decimals, but you might give it a try. 但是,不确定,如果它给你最多100个小数,但你可以尝试一下。

Using MPIR -- Multi Precision Integers and Rationals 使用MPIR - 多精度整数和理性

You can download a wrapper for the MPIR library for .NET here (download version 0.2) . 您可以在此处下载适用于.NETMPIR库的包装器(下载版本0.2) Then, do the following: 然后,执行以下操作:

  • Add the the files \\wrapper.*.dll to your project, make sure that on each built they are copied to your Debug or Release directory. 将files \\wrapper.*.dll到项目中,确保在每个构建时将它们复制到Debug或Release目录。
  • Add \\wrapper\\xmpir.cs to your project \\wrapper\\xmpir.cs添加到项目中
  • Add the following code to your project: 将以下代码添加到项目中:

     // set the precision to 512 bits (adjust this to your needs) mpir.mpf_set_default_prec(512); ulong default_prc = mpir.mpf_get_default_prec(); // init vars (important!) mpir.mpf_t val = mpir.mpf_init_set_d(.5); mpir.mpf_t result = mpir.mpf_init_set_ui(0); // calculate 0.5^200 mpir.mpf_pow_ui(result, val, 200); double dresult = mpir.mpf_get_d(result); // convert result to a string, in the form 1.2345 (dot not in output) and exp holding exponent long exp; string sresult = mpir.mpf_get_string(out exp, 10, 0, result); // free vars (important!) mpir.mpf_clear(val); mpir.mpf_clear(result); 

Note that the variable sresult will only hold the significant digits. 请注意,变量sresult仅保留有效数字。 You'll have to add the logic for printing the exponent as well, or a bunch of zeroes. 您还必须添加用于打印指数的逻辑,或者一堆零。

Result is 6.2230152778611417071440640537801242405902521687211671331011166147896988340353834411839448231257136169569665895551224821247160434722900390625E-60 结果是6.2230152778611417071440640537801242405902521687211671331011166147896988340353834411839448231257136169569665895551224821247160434722900390625E-60

A documentation PDF file on the full MPIR library shows how to use it in more detail. 完整MPIR库上的文档PDF文件显示了如何更详细地使用它。

If you use .net Framework 4.0, you can refernce System.Numerics assembly. 如果使用.net Framework 4.0,则可以引用System.Numerics程序集。 or you can download BigInteger from codeplex 或者您可以从codeplex下载BigInteger

Usage of BigIngeger : http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx BigIngeger的用法: http//msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx

for example: 例如:

string positiveString = "91389681247993671255432112000000";
string negativeString = "-90315837410896312071002088037140000";
BigInteger posBigInt = 0;
BigInteger negBigInt = 0;

try {
   posBigInt = BigInteger.Parse(positiveString);
   Console.WriteLine(posBigInt);
}
catch (FormatException)
{
   Console.WriteLine("Unable to convert the string '{0}' to a BigInteger value.", 
                     positiveString);
}

if (BigInteger.TryParse(negativeString, out negBigInt))
  Console.WriteLine(negBigInt);
else
   Console.WriteLine("Unable to convert the string '{0}' to a BigInteger value.", 
                      negativeString);

// The example displays the following output:
//   9.1389681247993671255432112E+31
//   -9.0315837410896312071002088037E+34

EDITED: here have a bigNum project http://sine.codeplex.com/ 编辑:这里有一个bigNum项目http://sine.codeplex.com/

using W3b.Sine;

public class ExpressionSample {

    public static void Main(String[] args) {

        Dictionary<String,BigNum> symbols = new Dictionary<String,BigNum>() {
            {"x", 100} // the implicit conversion defined
        };

        Expression expression = new Expression("1 + 2 / 3 * x");
        BigNum result = expression.Evaluate( symbols );
        Console.WriteLine( expression.ExpressionString + " == " + result.ToString() );

        BigNum x = 100;
        BigNum xPow100 = x.Pow( 100 );
        Console.WriteLine("100^100 == " + xPow100.ToString() );

    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM