Come ottengo parti intere e frazionarie da double in JSP / Java? Se il valore è 3,25, voglio ottenere fractional =.25
,whole = 3
Come possiamo farlo in Java?
Come ottengo parti intere e frazionarie da double in JSP / Java? Se il valore è 3,25, voglio ottenere fractional =.25
,whole = 3
Come possiamo farlo in Java?
Risposte:
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);
Uscite:
Integer part = 2
Fractional part = 0.2999999999999998
2.3
, ma sicuramente no 2.3
. E non c'è niente di sbagliato nell'output, a meno che tu non voglia più di 10 cifre valide. Tutto ciò di cui hai bisogno è un po 'di arrotondamento in ogni output (ad esempio, formato %.9f
) che di solito è meno doloroso di BigDecimal
. L'unico problema qui è l'overflow.
(long)1.0e100
te otterrai 0. Molte volte hai bisogno del doppio valore semplicemente "floored" per il quale c'è floor()
. Se si desidera utilizzare sia parti integrali che frazionarie modf()
. Davvero, questa è una cattiva risposta.
double value = 3.25;
double fractionalPart = value % 1;
double integralPart = value - fractionalPart;
%
per indicare modulo ( -3.25 % 1 == 0.75
) e altri, come Java, Fortran, C e C ++, usano %
per significare remainder ( -3.25 % 1 == -0.25
). WindRider potrebbe averlo digitato in un REPL Python per convenienza, ma quella risposta è fuorviante perché questa domanda riguarda la JVM.
Poiché questa domanda di 1 anno è stata sollevata da qualcuno che ha corretto l'oggetto della domanda, e questa domanda è stata contrassegnata con jsp, e nessuno qui è stato in grado di dare una risposta mirata JSP, ecco il mio contributo mirato JSP.
Usa JSTL (basta semplicemente inserire JSTL-1.2.jar in /WEB-INF/lib
) fmt taglib. C'è un <fmt:formatNumber>
tag che fa esattamente quello che vuoi e in modo abbastanza semplice con l'aiuto di maxFractionDigits
e maxIntegerDigits
attributi.
Ecco un SSCCE , copia e incolla e avvialo.
<%@ 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>
Produzione:
Intero: 3
Frazione: 0,25
Questo è tutto. Non c'è bisogno di massaggiarlo con l'aiuto del codice Java grezzo.
La domanda originale richiedeva l'esponente e la mantissa, piuttosto che la parte frazionaria e intera.
Per ottenere l'esponente e la mantissa da un doppio puoi convertirlo nella rappresentazione IEEE 754 ed estrarre i bit in questo modo:
long bits = Double.doubleToLongBits(3.25);
boolean isNegative = (bits & 0x8000000000000000L) != 0;
long exponent = (bits & 0x7ff0000000000000L) >> 52;
long mantissa = bits & 0x000fffffffffffffL;
Logica principale devi prima trovare quante cifre ci sono dopo il punto decimale.
Questo codice funziona per qualsiasi numero fino a 16 cifre. Se usi BigDecimal puoi eseguirlo solo per un massimo di 18 cifre. metti il valore di input (il tuo numero) alla variabile "num", qui come esempio l'ho codificato.
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 mantissa e l'esponente di un numero a virgola mobile doppia IEEE sono i valori tali che
value = sign * (1 + mantissa) * pow(2, exponent)
se la mantissa è della forma 0.101010101_base 2 (cioè il suo bit più significativo viene spostato dopo il punto binario) e l'esponente viene regolato per il bias.
Dalla 1.6, java.lang.Math fornisce anche un metodo diretto per ottenere l'esponente non corretto (chiamato getExponent (double))
Tuttavia, i numeri che stai chiedendo sono le parti integrali e frazionarie del numero, che possono essere ottenute utilizzando
integral = Math.floor(x)
fractional = x - Math.floor(x)
anche se potresti voler trattare i numeri negativi in modo diverso (floor(-3.5) == -4.0)
, a seconda del motivo per cui vuoi le due parti.
Suggerisco caldamente di non chiamare questi mantissa ed esponente.
[Modifica: la domanda originariamente chiedeva come ottenere la mantissa e l'esponente.]
Dove n è il numero per ottenere la mantissa / esponente reale:
exponent = int(log(n))
mantissa = n / 10^exponent
Oppure, per ottenere la risposta che stavi cercando:
exponent = int(n)
mantissa = n - exponent
Questi non sono esattamente Java, ma dovrebbero essere facili da convertire.
La parte intera ottiene dal casting semplice e per frazionario - divisione della stringa:
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
E se il tuo numero è 2.39999999999999. Suppongo che tu voglia ottenere il valore decimale esatto. Quindi 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);
Poiché il fmt:formatNumber
tag non fornisce sempre il risultato corretto, ecco un altro approccio solo JSP: formatta semplicemente il numero come stringa ed esegue il resto del calcolo sulla stringa, poiché è più semplice e non richiede ulteriore virgola mobile aritmetica.
<%@ 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
arrotonda il suo argomento, che in questo caso non è voluto.
Molte di queste risposte hanno orribili errori di arrotondamento perché trasmettono numeri da un tipo all'altro. Che ne dite di:
double x=123.456;
double fractionalPart = x-Math.floor(x);
double wholePart = Math.floor(x);
Math.abs
?
La risposta accettata non funziona bene per i numeri negativi compresi tra -0 e -1,0. Assegna anche la parte frazionaria negativa.
Ad esempio: per il numero -0,35
ritorna
Parte intera = 0 Parte frazionaria = -0,35
Se stai lavorando con coordinate GPS è meglio avere un risultato con il segno sulla parte intera come:
Parte intera = -0 Parte frazionaria = 0,35
Questi numeri vengono utilizzati ad esempio per le coordinate GPS, dove è importante il segno per la posizione Lat o Long
Proponi codice:
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));
Produzione:
Integer part = -0
Fractional part = 0,3500
A partire da Java 8, puoi usare Math.floorDiv
.
Restituisce il più grande (più vicino all'infinito positivo) int
minore o uguale al quoziente algebrico.
Qualche esempio:
floorDiv(4, 3) == 1
floorDiv(-4, 3) == -2
In alternativa, l' /
operatore può essere utilizzato:
(4 / 3) == 1
(-4 / 3) == -1
Riferimenti:
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
OK, forse è tardi, ma penso che l'approccio migliore e più accurato sia usare 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
, stiamo parlando di input e output, metti valore e recuperi il tuo valore senza perdere lo 0,001% di esso! e questo preciso, non fuorviante!
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);
}
}