¿Cómo obtengo partes enteras y fraccionarias del doble en JSP / Java? Si el valor es 3.25, entonces quiero obtener fractional =.25
,whole = 3
¿Cómo podemos hacer esto en Java?
¿Cómo obtengo partes enteras y fraccionarias del doble en JSP / Java? Si el valor es 3.25, entonces quiero obtener fractional =.25
,whole = 3
¿Cómo podemos hacer esto en Java?
Respuestas:
http://www.java2s.com/Code/Java/Data-Type/Obtainingtheintegerandfractionalparts.htm
double num;
long iPart;
double fPart;
// Get user input
num = 2.3d;
iPart = (long) num;
fPart = num - iPart;
System.out.println("Integer part = " + iPart);
System.out.println("Fractional part = " + fPart);
Salidas:
Integer part = 2
Fractional part = 0.2999999999999998
2.3
, pero seguramente no 2.3
. Y no hay nada de malo en la salida, a menos que desee mucho más de 10 dígitos válidos. Todo lo que necesita es algo de redondeo en cada salida (por ejemplo, formato %.9f
) que generalmente es menos complicado que BigDecimal
. El único problema aquí es el desbordamiento.
(long)1.0e100
obtendrá 0. Muchas veces necesita el valor doble simplemente "floored" para el que existe floor()
. Si desea utilizar partes integrales y fraccionarias modf()
. Realmente, esta es una mala respuesta.
double value = 3.25;
double fractionalPart = value % 1;
double integralPart = value - fractionalPart;
%
para significar módulo ( -3.25 % 1 == 0.75
) y otros, como Java, Fortran, C y C ++, usan %
para significar resto ( -3.25 % 1 == -0.25
). WindRider puede haberlo escrito en un REPL de Python por conveniencia, pero esa respuesta es engañosa porque esta pregunta es sobre la JVM.
Dado que esta pregunta de 1 año fue lanzada por alguien que corrigió el asunto de la pregunta, y esta pregunta está etiquetada jsp, y nadie aquí pudo dar una respuesta dirigida a JSP, aquí está mi contribución dirigida a JSP.
Utilice JSTL (simplemente coloque jstl-1.2.jar en /WEB-INF/lib
) fmt taglib. Hay una <fmt:formatNumber>
etiqueta que hace exactamente lo que quieres y de una manera bastante fácil con la ayuda de maxFractionDigits
y maxIntegerDigits
atributos.
Aquí hay un SSCCE , simplemente cópielo, péguelo y ejecútelo.
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%
// Just for quick prototyping. Don't do this in real! Use servlet/javabean.
double d = 3.25;
request.setAttribute("d", d);
%>
<!doctype html>
<html lang="en">
<head>
<title>SO question 343584</title>
</head>
<body>
<p>Whole: <fmt:formatNumber value="${d}" maxFractionDigits="0" />
<p>Fraction: <fmt:formatNumber value="${d}" maxIntegerDigits="0" />
</body>
</html>
Salida:
Entero: 3
Fracción: .25
Eso es. No es necesario masajearlo con la ayuda de código Java sin procesar.
La pregunta original pedía el exponente y la mantisa, en lugar de la parte fraccionaria y entera.
Para obtener el exponente y la mantisa de un doble, puede convertirlo en la representación IEEE 754 y extraer los bits de esta manera:
long bits = Double.doubleToLongBits(3.25);
boolean isNegative = (bits & 0x8000000000000000L) != 0;
long exponent = (bits & 0x7ff0000000000000L) >> 52;
long mantissa = bits & 0x000fffffffffffffL;
Lógica principal: primero tienes que encontrar cuántos dígitos hay después del punto decimal.
Este código funciona para cualquier número de hasta 16 dígitos. Si usa BigDecimal, puede ejecutarlo solo para hasta 18 dígitos. ponga el valor de entrada (su número) a la variable "num", aquí como ejemplo lo he codificado.
double num, temp=0;
double frac,j=1;
num=1034.235;
// FOR THE FRACTION PART
do{
j=j*10;
temp= num*j;
}while((temp%10)!=0);
j=j/10;
temp=(int)num;
frac=(num*j)-(temp*j);
System.out.println("Double number= "+num);
System.out.println("Whole part= "+(int)num+" fraction part= "+(int)frac);
La mantisa y el exponente de un número de coma flotante doble IEEE son los valores tales que
value = sign * (1 + mantissa) * pow(2, exponent)
si la mantisa tiene la forma 0.101010101_base 2 (es decir, su bit más significativo se desplaza para estar después del punto binario) y el exponente se ajusta por sesgo.
Desde 1.6, java.lang.Math también proporciona un método directo para obtener el exponente insesgado (llamado getExponent (doble))
Sin embargo, los números que solicita son las partes integrales y fraccionarias del número, que se pueden obtener usando
integral = Math.floor(x)
fractional = x - Math.floor(x)
aunque es posible que desee tratar los números negativos de manera diferente (floor(-3.5) == -4.0)
, dependiendo de por qué desea las dos partes.
Sugiero encarecidamente que no los llame mantisa y exponente.
[Editar: la pregunta originalmente preguntaba cómo obtener la mantisa y el exponente].
Donde n es el número para obtener la mantisa / exponente real:
exponent = int(log(n))
mantissa = n / 10^exponent
O, para obtener la respuesta que estaba buscando:
exponent = int(n)
mantissa = n - exponent
Estos no son exactamente Java, pero deberían ser fáciles de convertir.
La parte entera se obtiene de la fundición simple y para la división de cadenas fraccionarias:
double value = 123.004567890
int integerPart = (int) value; // 123
int fractionPart =
Integer.valueOf(String.valueOf(value)
.split(".")[1]); // 004567890
/**
* To control zeroes omitted from start after parsing.
*/
int decimals =
String.valueOf(value)
.split(".")[1].length(); // 9
¿Qué pasa si su número es 2.39999999999999? Supongo que desea obtener el valor decimal exacto. Luego usa BigDecimal:
Integer x,y,intPart;
BigDecimal bd,bdInt,bdDec;
bd = new BigDecimal("2.39999999999999");
intPart = bd.intValue();
bdInt = new BigDecimal(intPart);
bdDec = bd.subtract(bdInt);
System.out.println("Number : " + bd);
System.out.println("Whole number part : " + bdInt);
System.out.println("Decimal number part : " + bdDec);
Dado que la fmt:formatNumber
etiqueta no siempre produce el resultado correcto, aquí hay otro enfoque solo de JSP: simplemente formatea el número como una cadena y hace el resto del cálculo en la cadena, ya que es más fácil y no implica más puntos flotantes aritmética.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%
double[] numbers = { 0.0, 3.25, 3.75, 3.5, 2.5, -1.5, -2.5 };
pageContext.setAttribute("numbers", numbers);
%>
<html>
<body>
<ul>
<c:forEach var="n" items="${numbers}">
<li>${n} = ${fn:substringBefore(n, ".")} + ${n - fn:substringBefore(n, ".")}</li>
</c:forEach>
</ul>
</body>
</html>
fmt:formatNumber
Redondea su argumento, que no se desea en este caso.
La respuesta aceptada no funciona bien para números negativos entre -0 y -1.0 También dé la parte fraccionaria negativa.
Por ejemplo: para el número -0,35
devoluciones
Parte entera = 0 Parte fraccionaria = -0,35
Si está trabajando con coordenadas GPS, es mejor obtener un resultado con el signo en la parte entera como:
Parte entera = -0 Parte fraccionaria = 0.35
Estos números se utilizan, por ejemplo, para las coordenadas GPS, donde es importante el signo de la posición Lat o Long
Proponer código:
double num;
double iPart;
double fPart;
// Get user input
num = -0.35d;
iPart = (long) num;
//Correct numbers between -0.0 and -1.0
iPart = (num<=-0.0000001 && num>-1.0)? -iPart : iPart ;
fPart = Math.abs(num - iPart);
System.out.println(String.format("Integer part = %01.0f",iPart));
System.out.println(String.format("Fractional part = %01.04f",fPart));
Salida:
Integer part = -0
Fractional part = 0,3500
Desde Java 8, puede usar Math.floorDiv
.
Devuelve el valor más grande (más cercano al infinito positivo) int
que es menor o igual que el cociente algebraico.
Algunos ejemplos:
floorDiv(4, 3) == 1
floorDiv(-4, 3) == -2
Alternativamente, el /
operador se puede utilizar:
(4 / 3) == 1
(-4 / 3) == -1
Referencias:
String value = "3.06";
if(!value.isEmpty()){
if(value.contains(".")){
String block = value.substring(0,value.indexOf("."));
System.out.println(block);
}else{
System.out.println(value);
}
}
// target float point number
double d = 3.025;
// transfer the number to string
DecimalFormat df = new DecimalFormat();
df.setDecimalSeparatorAlwaysShown(false);
String format = df.format(d);
// split the number into two fragments
int dotIndex = format.indexOf(".");
int iPart = Integer.parseInt(format.substring(0, dotIndex)); // output: 3
double fPart = Double.parseDouble(format.substring(dotIndex)); // output: 0.025
De acuerdo, esto quizás sea tarde, pero creo que el mejor y más preciso enfoque es usar BigDecimal
double d = 11.38;
BigDecimal bigD = BigDecimal.valueOf(d);
int intPart = bigD.intValue();
double fractionalPart = bigD.subtract(BigDecimal.valueOf(intPart)).doubleValue();
System.out.println(intPart); // 11
System.out.println(fractionalPart ); //0.38
input (5.03)
output int = 5 , fractional = 0.0299999
, estamos hablando de entradas y salidas, ¡pones valor y recuperas tu valor sin perder el 0.001%! ¡Y esto es exacto, no engañoso!
public class MyMain2 {
public static void main(String[] args) {
double myDub;
myDub=1234.5678;
long myLong;
myLong=(int)myDub;
myDub=(myDub%1)*10000;
int myInt=(int)myDub;
System.out.println(myLong + "\n" + myInt);
}
}