2010-07-29 13 views
7

Como se mencionó anteriormente. Doy un ejemplo, digamos que todos los valores de ensayo están a menos de 1 pero mayor que 0.Cómo cambiar 0.xxxx a xxxx en Java

  • 0,12 (precisión: 3, la escala: 2)
  • 0,345 (precisión: 4, escala: 3)
  • 0.6789 (precisión: 5, escala: 4)

¿Cómo convierto los valor sin la codificación dura el valor de escala y precisión.

  • 0,12 -> 12
  • 0,345 -> 345
  • 0,6789 -> 6789

de 0,1 y 0,01 y 0,001 deben recibir 1 (sé que esto mala idea i pero yo he sido dado conjuntos de reglas de negocio del software)

prefiero la solución en Java pero si hay un algoritmo matemático es mejor. gracias.

+2

¿Cómo se extrae la parte fraccionaria? Como un entero? En ese caso, ¿qué se supone que le suceda a valores como 0.0042? – snemarch

+0

¿Son estos BigDecimals o dobles? Los dobles tendrán problemas de precisión. –

Respuesta

11

La solución es mucho más sencilla que cualquiera presentada aquí. Deberías usar BigDecimal:

BigDecimal a = new BigDecimal("0.0000012"); 
BigDecimal b = a.movePointRight(a.scale()); 
+0

+1 para una respuesta simple y correcta. – NullUserException

+0

más simple que nunca. solo preguntando ... ¿cómo si x> 1 ej .: 1.0000012 hay alguna otra forma? – ommar

+0

+1 pero no puedo votar (no registrado)! El constructor BigDecimal (String) se debe usar para que funcione correctamente entre 0 <= x <1 – eee

4

Multiplique por 10 hasta trunc x = x.

Algo así como (código no probado):

double val = ... ; // set the value. 

while(Math.floor(val) != val) 
    val *= 10.0; 
+2

Error de coma flotante * podría * morderlo teóricamente aquí, ya que 10 no es un múltiplo de 2. – Amber

+0

También soy un poco escéptico con respecto a este bit: Math.floor (val)! = Val – Cambium

+0

buena idea hasta el momento, pero a plazo de rendimiento podría ser más lento para 0.12345678987654321 y más ... – ommar

3

Una opción sería la de simplemente convertir a cadena, dividida en el punto decimal, y agarrar la parte después de nuevo en un entero:

Integer.parseInt((Double.toString(input_val).split('\\.'))[1]) 

. (Nota: es posible que desee hacer un poco de comprobación de errores como parte del proceso; el código de ejemplo anterior es una versión condensada simplemente diseñado para transmitir el punto)

+0

No es una solución particularmente buena, considere 1.1 contra 1.001 :) – snemarch

+0

¿Qué tal? El OP no especificó qué se debe hacer con los ceros a la izquierda, si existen, y no es como si cualquier otra solución pudiera manejarlos mejor ... – Amber

+0

la pregunta se actualizó. Sé que es extraño pero está documentado así que – ommar

0

Mejorar la idea de Ámbar:

//for 0 <= x < 1 
Integer.parseInt((Double.toString(x).replaceFirst("0.", "")); 

funciona bien desde cualquier valor por debajo de 1. Cualquier valor por encima de 1 y desencadenará java.lang.NumberFormatException

Editar: ¿Puede alguien decirme la diferencia si los datos son ¿como abajo?

0.0012 -> 12 
0.12 -> 12 
+0

@NullUserException, no veo cuál sería el problema con su código y su ejemplo (además del paréntesis adicional al principio). Con x + 0.0000001, Double.toString (x) devolvería "0.0000001" y luego replaceFirst devolvería "0000001", que se puede analizar en int, ¿no? –

+0

Intente hacer eso con x = 0.0000001; también se rompe con x = 0.001 (produce 10 en lugar de 1) – NullUserException

+0

@Kiranu Negatory. 'Double.toString' convertirá' 0.0001' a '1.0E-4', rompiendo así el código. – NullUserException

0

¿Estás intentando algo como esto?

public static void main(String[] args) { 
    double d = 0.1234; 
    while(d>(long)d){ 
     d*=10; 
    } 
    System.out.println((long)d); 
} 
Cuestiones relacionadas