¿Cuál es el equivalente de la clase Java BigDecimal en C#?


BigDecimal es una clase en el paquete java.math que tiene muchos beneficios para manejar grandes números de una cierta escala. ¿Hay una clase o tipo de datos equivalente en c# con esta característica?

Author: Nathan Baulch, 2010-05-19

6 answers

C# solo lo ha construido BigInteger (en.NET framework 4).

Es decimal suficiente precisión para su tarea? Es un número de 128 bits que puede contener valores en el rango ±1.0 × 10-28 to ±7.9 × 1028.

 25
Author: Dean Harding,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-19 06:48:22

Recientemente también necesitaba un decimal de precisión arbitraria en C# y me encontré con la idea publicada aquí: https://stackoverflow.com/a/4524254/804614

Luego completé el borrador para admitir todos los operadores básicos de aritmética y comparación, así como las conversiones a y desde todos los tipos numéricos típicos y algunos métodos exponenciales, que necesitaba en ese momento.

Ciertamente no es completo, pero muy funcional y casi listo para usar. Como este es el resultado de una noche de codificación, no puedo asegurar que esta cosa está libre de errores o totalmente exacta, pero funcionó muy bien para mí. De todos modos, quiero publicarlo aquí porque no encontré ninguna otra manera de usar decimales de precisión arbitraria en C# sin la necesidad de incluir librerías masivas (en su mayoría ni.net, sino envoltorios para c++), que vienen con todo tipo de cosas innecesarias.

La idea básica es construir un tipo de coma flotante personalizado con una mantissa grande arbitraria utilizando el tipo BigInteger de. NET 4.0 y un exponente base 10 (Int32).

Si encuentra errores/inexactitudes, tiene sugerencias o cualquier cosa constructiva, no dude en editar directamente mi publicación o dejar un comentario para que pueda mejorar la respuesta.

No estoy del todo seguro de si este es el mejor lugar para colocar esta cosa, pero esta es una de las principales preguntas sobre este tema y realmente quiero compartir mi solución. ;)

EDITAR: Moví la implementación a GitHubGist: https://gist.github.com/JcBernack/0b4eef59ca97ee931a2f45542b9ff06d

 39
Author: Gigo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-25 19:16:46

Bueno, aparte de usar bibliotecas de terceros con soporte de BigDecimal (si existen), no hay soluciones fáciles. La forma más fácil, en lo que a mí respecta, es tomar una implementación decimal( de mono, por ejemplo) y reescribirla usando el tipo BigInteger. Internamente, en la implementación de mono, el tipo decimal se compone de tres enteros. Así que no creo que eso sea difícil de implementar. Sin embargo, no estoy seguro de la eficiencia. Sin embargo, primero debe considerar usar tipo decimal estándar como codeka mencionado.

 4
Author: n535,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-19 07:29:16

Aquí hay una biblioteca de C # que hace lo que está buscando, y en algunos casos tiene funcionalidad adicional: http://www.fractal-landscapes.co.uk/bigint.html (o inténtelo en http://web.archive.org/web/20110721173046/http://www.fractal-landscapes.co.uk/bigint.html).

Por ejemplo, tiene una función de raíz cuadrada, que BigDecimal no tiene:

PrecisionSpec precision = new PrecisionSpec(1024, PrecisionSpec.BaseType.BIN);
BigFloat bf = new BigFloat(13, precision);
bf.Sqrt();
Console.WriteLine(bf.ToString());

Wikipedia tiene una lista de otras bibliotecas en http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic#Libraries

 4
Author: RedGreenCode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-03 21:16:17

Esto puede no haber sido una opción cuando la pregunta se publicó originalmente, pero una manera realmente fácil de usar un BigDecimal en su código C # es instalar el IKVM.NET paquete vía NuGet:

PM> Install-Package IKVM

Entonces haz exactamente lo que harías en 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));
        }
    }
}

Dependiendo de lo lejos que vaya con IKVM puede haber el problema de interop ocasional para tropezar, pero en mi experiencia, por lo general funciona muy bien para cosas simples como esta.

 2
Author: toddprater,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-13 04:45:38

Deveel Math

[1]} GitHub:

Https://github.com/deveel/deveel-math

Autor GitHub:

Antonello Provenzano

Soporte:

  • BigComplex
  • BigDecimal
  • BigMath
  • Racional
  • ...

Cómo instalarlo

Desde la consola de administración de paquetes de NuGet, seleccione el proyecto donde se instalará la biblioteca y escriba el siguiente comando

PM> Install-Package dmath
 1
Author: TUPUNCO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-02 09:04:21