¿Cuál es el equivalente de la clase Java BigDecimal en C#?
(6)
Deveel Math
GitHub:
https://github.com/deveel/deveel-math
Autor GitHub:
Apoyo:
- BigComplex
- BigDecimal
- BigMath
- Racional
- ...
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
BigDecimal
es una clase en el paquete java.math
que tiene muchos beneficios para manejar grandes cantidades de una determinada escala. ¿Hay una clase o tipo de datos equivalente en c # con esta característica?
Aquí hay una biblioteca de C # que hace lo que está buscando, y en algunos casos tiene una funcionalidad adicional: http://www.fractal-landscapes.co.uk/bigint.html (o pruébelo 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 similares en http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic#Libraries
Bueno, aparte de utilizar bibliotecas de terceros con soporte de BigDecimal (si existen), no hay soluciones fáciles. La manera 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. Entonces no creo que eso sea difícil de implementar. Aunque no estoy seguro acerca de la eficiencia. Sin embargo, primero debe considerar el uso de tipo decimal estándar como se mencionó en codeka .
C # solo lo ha construido BigInteger
(en .NET framework 4).
¿Es suficiente la precisión decimal
para su tarea? Es un número de 128 bits que puede contener valores en el rango ± 1.0 × 10 -28 a ± 7.9 × 10 28 .
Puede que esta no haya 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 paquete IKVM.NET a través de NuGet:
PM> Install-Package IKVM
Luego haz exactamente lo mismo 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 qué tan lejos llegues con IKVM, puede haber problemas ocasionales de interoperabilidad, pero en mi experiencia, por lo general, funcionan muy bien para cosas simples como esta.
Recientemente también necesitaba un decimal de precisión arbitrario en C # y me encontré con la idea publicada aquí: https://.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 hacia y desde todos los tipos numéricos típicos y algunos métodos exponenciales, que necesitaba en ese momento.
Ciertamente no es completo, pero es muy funcional y está casi listo para usar. Como este es el resultado de una codificación de una noche, no puedo asegurar que esto esté libre de errores o sea completamente exacto, pero funcionó muy bien para mí. De todos modos, quiero publicarlo aquí porque no encontré ninguna otra manera de usar decimales de precisión arbitrarios en C # sin la necesidad de incluir bibliotecas masivas (la mayoría ni siquiera .NET, pero envoltorios para c ++), que vienen con todo tipo de datos innecesarios cosas.
La idea básica es construir un tipo de coma flotante personalizado con una mantisa grande arbitraria utilizando el tipo BigInteger de .NET 4.0 y un exponente de base 10 (Int32).
Si encuentra errores / imprecisiones, tiene sugerencias o algo constructivo, 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 esto, 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