2012-01-06 9 views
14

Estaba leyendo sobre tipos de datos en C. Encontré que el rango de long double es más que el de double en java. Para un número muy grande, podemos usar el doble largo en C. Si quiero almacenar el mismo número en java, ¿qué tenemos que hacer? ¿qué tipo de datos podemos usar?¿Hay algún reemplazo de doble largo en java?

doble en java tarda 8 bytes (64 bits) IEEE 754. Cubre una gama de 4.94065645841246544e-324d para 1.79769313486231570e + 308d (positivo o negativo).

longdouble in c takes 10 bytes (80 bits) 

Puede alguien decirme ¿hay alguna sustitución de longdouble en Java

+3

Prueba BigDecimal. –

+0

Bigdecimal no es un tipo de datos, no podemos hacer operaciones aritméticas directamente usando operadores aritméticos. –

+0

'long double' es un compilador específico en C, en la mayoría de las plataformas tiene el mismo tamaño que' double'. –

Respuesta

9

Aunque no es un reemplazo, puede usar java.lang.math.BigDecimal.Puede almacenar aproximadamente mil millones de dígitos hasta que se quede sin memoria. Es una clase de precisión arbitraria, se volverá tan grande como desees hasta que tu computadora se quede sin memoria.

De acuerdo con la documentación de BigDecimal:

inmutable, de precisión arbitraria firmó números decimales. Un BigDecimal consiste en un valor sin escalar entero de precisión arbitrario y una escala entera no negativa de 32 bits , que representa el número de dígitos a la derecha del punto decimal. El número representado por el BigDecimal es (unscaledValue/10scale). BigDecimal proporciona operaciones para aritmética básica, manipulación de escala, comparación, hash y conversión de formato.

+1

Pero no puedo usar operadores aritméticos para el cálculo aritmético como suma, resta, etc. –

+0

@SunilKumarSahoo Tiene un método que hace lo mismo. Se ha sugerido que los operadores de soporte de Java para BigInteger y BigDecimal. –

+0

y BigDecimal no sufre de errores de imprecisión –

3

No hay sustituto recta en Java.

Puede usar BigDecimal para este fin.

Debe comprender que cuanto mayor sea su doble valor, mayor será la pérdida de precisión que recibirá al usarlo en sus operaciones matemáticas. BigDecimal te ayuda a conocer este problema.

Aquí es ejemplo de código con BigDecimal:

String decimalString = "1423545135143513.523"; 
BigDecimal decimal = new BigDecimal(decimalString); 

By this link se pueden encontrar muchos ejemplos con el uso de la clase BigDecimal.

+0

Pero no puedo usar operadores aritméticos para el cálculo aritmético como suma, resta, etc. –

+0

Puede. p.ej. decimal.divide (nuevo BigDecimal ("11.11")); Por favor, lea la API por el enlace que he publicado. Edité mi publicación, seguí el enlace y aprendí algunos ejemplos. – Artem

+0

decimal.divide() no es un operador, ¿es un método? Mencioné en mis comentarios que no podemos usar operadores aritméticos –

2

En cuanto al tipo primitivo, no hay ningún lado de doble y flotante, que maneja el punto flotante.

Pero, BigDecimal podría ser lo que estás buscando.

+0

Pero no puedo usar operadores aritméticos para el cálculo aritmético como suma, resta, etc. –

+0

No se pueden usar operadores aritméticos normales porque es un objeto. Tendrá que usar métodos en la API, como .add(), .subtract(), etc ... Es un poco tedioso, pero a cambio, tendrá más potencia y otras operaciones sofisticadas. Pero ten cuidado con la división, ya que arrojará excepciones si es como 1/3, entonces será la expansión decimal no terminadora. – HeavenAgain

1

Documentación de BigDecimal afirma:

para sumar (sumando BigDecimal) Devuelve un BigDecimal cuyo valor es (esto sumando +), y cuya escala es max (this.scale(), augend.scale()).

import java.math.BigDecimal; 

    public class AddTwoBigNumbers{ 
     public static void main(String[] args) { 
     BigDecimal num1, num2; 
     num1 = new BigDecimal(50.00035); 
     num2 = new BigDecimal(100.0025); 
     Sum(num1, num2); 
     } 

     public static void Sum(BigDecimal val1, BigDecimal val2){ 
     BigDecimal sum = val1.add(val2); 
     System.out.println("Sum of two BigDecimal numbers: "+ sum); 
     } 
    } 
0

No, pero se puede utilizar la interfaz nativa de Java para llamar a un método nativo que lleva a cabo el cálculo utilizando el tipo doble de largo.Luego puede almacenarlo en 10 bytes o truncarlo.

Si es aceptable un truncamiento final para duplicar, dependiendo de la máquina virtual que utilice, es posible que los valores intermedios se almacenen en doble largo de todos modos. En este caso, no necesita el método nativo.

Cuestiones relacionadas