Pregunta

BigDecimal es una clase del paquete java.math que tiene una gran cantidad de beneficios para el manejo de grandes cantidades de una cierta escala. ¿Hay una clase o tipo de datos equivalente en C # con esta característica.

¿Fue útil?

Solución

C # sólo ha construido BigInteger ella (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 de ± 1,0 × 10 -28 a ± 7,9 × 10 28 .

Otros consejos

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

Luego completó el proyecto para apoyar a todos los operadores aritméticos y de comparación básicos, así como las conversiones desde y hacia todos los tipos numéricos típicos y unos métodos exponenciales, lo que necesitaba en ese momento.

Desde luego, no es exhaustiva, pero muy funcional y casi listos para su uso. Ya que esto es el resultado de la codificación de una noche, no puedo asegurar que esta cosa es libre de errores o totalmente exacta, pero funcionó muy bien para mí. De todos modos, quiero publicar aquí porque no he encontrado ninguna otra manera de usar decimales de precisión arbitraria en C #, sin la necesidad de incluir librarys masivas (en su mayoría ni siquiera .net, pero envoltorios a C ++), que vienen con todo tipo de innecesaria cosas.

La idea básica es construir una costumbre tipo de punto flotante con una gran arbitraria mantisa utilizando el tipo de BigInteger .NET 4.0 y un exponente de base 10 (Int32).

Si encuentras bugs / errores, tienen sugerencias o algo constructivo, no dude en editar mi post directamente o dejar un comentario, así que puede 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 lo que alrededor de este tema y realmente quiero compartir mi solución. ;)

EDIT: Me mudé a la implementación GitHubGist: https://gist.github.com/JcBernack/0b4eef59ca97ee931a2f45542b9ff06d

Bueno, aparte de utilizar las bibliotecas de terceros con el apoyo de la BigDecimal (si existen), no hay soluciones alternativas fáciles. La forma más fácil, por lo que a mí respecta es tomar una implementación decimal (de mono por ejemplo) y volver a escribir utilizando el tipo BigInteger. Internamente, en la implementación del mono, el tipo decimal se compone de tres números enteros. Así que no creo que sea difícil de implementar. No estoy seguro acerca de la eficiencia sin embargo. Sin embargo primero debe considerar el uso de tipo decimal estándar como codeka se ha mencionado.

Hay una biblioteca de C # llamado bignum que hace lo que está buscando, y en algunos casos tiene una funcionalidad adicional.

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

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 / arbitraria-precision_arithmetic # Bibliotecas

Fuentes:

Esto puede no haber sido una opción cuando la pregunta fue publicada originalmente, pero de una manera muy fácil de usar un BigDecimal en el código C # es la instalación de la IKVM.NET través NuGet:

PM> Install-Package IKVM

A continuación, haga exactamente como lo haría 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));
        }
    }
}

En función de lo lejos que vaya con IKVM no puede ser el problema de interoperabilidad de vez en cuando a través de tropezar pero en mi experiencia por lo general funciona muy bien para cosas simples como esto.

Deveel Math

GitHub:

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

Autor GitHub:

Antonello Provenzano

Soporte:

  • BigComplex
  • BigDecimal
  • BigMath
  • Rational
  • ...

Cómo instalarlo

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

PM> Install-Package dmath

También puede utilizar el Math.Gmp.Native NuGet paquete que escribí. Su código fuente está disponible en GitHub , y la documentación está disponible aquí . Expone a .NET toda la funcionalidad de la GMP biblioteca que se conoce como una precisión arbitraria altamente optimizado biblioteca.

precisión arbitraria números de coma flotante están representados por la rel mpf_t tipo "noreferrer nofollow". Las operaciones en estos números de punto flotante todas comienzan con el prefijo mpf_. Para ejemplos, mpf_add o mpf_cmp . ejemplos de código fuente se dan para cada operación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top