Wie erhalte ich in JSP / Java ganze und gebrochene Teile von double? Wenn der Wert 3,25 ist, dann möchte ich bekommen fractional =.25
,whole = 3
Wie können wir das in Java machen?
Wie erhalte ich in JSP / Java ganze und gebrochene Teile von double? Wenn der Wert 3,25 ist, dann möchte ich bekommen fractional =.25
,whole = 3
Wie können wir das in Java machen?
Antworten:
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);
Ausgänge:
Integer part = 2
Fractional part = 0.2999999999999998
2.3
, aber sicherlich nicht 2.3
. Und an der Ausgabe ist nichts auszusetzen, es sei denn, Sie möchten mehr als 10 gültige Ziffern. Alles, was Sie brauchen, ist eine Rundung in jeder Ausgabe (z. B. Format %.9f
), die normalerweise weniger schmerzhaft ist als BigDecimal
. Das einzige Problem hierbei ist der Überlauf.
(long)1.0e100
dich bekommst du 0. In vielen Fällen brauchst du den doppelten Wert einfach "bodenständig", für den es gibt floor()
. Wenn Sie sowohl Integral- als auch Bruchteile verwenden möchten, verwenden Sie diese modf()
. Das ist wirklich eine schlechte Antwort.
double value = 3.25;
double fractionalPart = value % 1;
double integralPart = value - fractionalPart;
%
modulo ( -3.25 % 1 == 0.75
) und andere wie Java, Fortran, C und C ++ %
den Rest ( -3.25 % 1 == -0.25
) bedeuten . WindRider hat es aus Gründen der Zweckmäßigkeit möglicherweise in eine Python-REPL eingegeben, aber diese Antwort ist irreführend, da es sich bei dieser Frage um die JVM handelt.
Da diese 1-jährige Frage von jemandem aufgeworfen wurde, der das Thema der Frage korrigiert hat, und diese Frage mit einem Tag versehen jspist und hier niemand eine JSP-gezielte Antwort geben konnte, ist hier mein JSP-gezielter Beitrag.
Verwenden Sie JSTL (lassen Sie einfach jstl-1.2.jar ein /WEB-INF/lib
) fmt taglib. Es gibt ein <fmt:formatNumber>
Tag, das mit Hilfe von maxFractionDigits
und maxIntegerDigits
Attributen genau das macht, was Sie wollen und auf ganz einfache Weise .
Hier ist eine SSCCE , kopiere sie einfach und führe sie aus.
<%@ 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>
Ausgabe:
Ganzes: 3
Bruchteil: 0,25
Das ist es. Sie müssen es nicht mit Hilfe von Java-Rohcode massieren.
Die ursprüngliche Frage bezog sich eher auf den Exponenten und die Mantisse als auf den Bruchteil und den ganzen Teil.
Um den Exponenten und die Mantisse aus einem Doppel zu erhalten, können Sie sie in die IEEE 754- Darstellung konvertieren und die Bits wie folgt extrahieren:
long bits = Double.doubleToLongBits(3.25);
boolean isNegative = (bits & 0x8000000000000000L) != 0;
long exponent = (bits & 0x7ff0000000000000L) >> 52;
long mantissa = bits & 0x000fffffffffffffL;
Hauptlogik Sie müssen zuerst herausfinden, wie viele Stellen nach dem Dezimalpunkt stehen.
Dieser Code funktioniert für eine beliebige Zahl mit bis zu 16 Ziffern. Wenn Sie BigDecimal verwenden, können Sie es nur mit bis zu 18 Stellen ausführen. Setzen Sie den Eingabewert (Ihre Nummer) in die Variable "num", hier als Beispiel habe ich ihn fest codiert.
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);
Die Mantisse und der Exponent einer IEEE-Doppelgleitkommazahl sind die Werte, die
value = sign * (1 + mantissa) * pow(2, exponent)
wenn die Mantisse die Form 0.101010101_base 2 hat (dh ihr signifikantestes Bit wird verschoben, um nach dem Binärpunkt zu liegen) und der Exponent auf Vorspannung eingestellt ist.
Seit 1.6 bietet java.lang.Math auch eine direkte Methode zum Abrufen des unverzerrten Exponenten (getExponent (double) genannt).
Die Zahlen, nach denen Sie fragen, sind jedoch die integralen und gebrochenen Teile der Zahl, die mit erhalten werden können
integral = Math.floor(x)
fractional = x - Math.floor(x)
Möglicherweise möchten Sie negative Zahlen jedoch unterschiedlich behandeln (floor(-3.5) == -4.0)
, je nachdem, warum Sie die beiden Teile möchten.
Ich würde dringend empfehlen, diese Mantisse und diesen Exponenten nicht zu nennen.
[Bearbeiten: Die Frage fragte ursprünglich, wie man die Mantisse und den Exponenten erhält.]
Wobei n die Zahl ist, um die reale Mantisse / den Exponenten zu erhalten:
exponent = int(log(n))
mantissa = n / 10^exponent
Oder um die Antwort zu erhalten, nach der Sie gesucht haben:
exponent = int(n)
mantissa = n - exponent
Diese sind nicht genau Java, sollten aber einfach zu konvertieren sein.
Der ganzzahlige Teil ergibt sich aus dem einfachen Casting und für die Teilung von Teilstrings:
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
Was ist, wenn Ihre Nummer 2.39999999999999 lautet? Ich nehme an, Sie möchten den genauen Dezimalwert erhalten. Verwenden Sie dann 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);
Da das fmt:formatNumber
Tag nicht immer das richtige Ergebnis liefert, gibt es einen weiteren Ansatz nur für JSP: Es formatiert nur die Zahl als Zeichenfolge und führt den Rest der Berechnung für die Zeichenfolge durch, da dies einfacher ist und keinen weiteren Gleitkommawert beinhaltet Arithmetik.
<%@ 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
rundet sein Argument ab, das in diesem Fall nicht erwünscht ist.
Die akzeptierte Antwort funktioniert nicht gut für negative Zahlen zwischen -0 und -1,0. Geben Sie auch den Bruchteil negativ an.
Zum Beispiel: Für die Nummer -0,35
kehrt zurück
Ganzzahliger Teil = 0 Bruchteil = -0,35
Wenn Sie mit GPS-Koordinaten arbeiten, ist es besser, ein Ergebnis mit dem Signal auf dem ganzzahligen Teil zu erhalten als:
Ganzzahliger Teil = -0 Bruchteil = 0,35
Diese Zahlen werden beispielsweise für GPS-Koordinaten verwendet, wobei das Signal für die Lat- oder Long-Position wichtig ist
Code vorschlagen:
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));
Ausgabe:
Integer part = -0
Fractional part = 0,3500
Seit Java 8 können Sie verwenden Math.floorDiv
.
Es wird der größte int
Wert (der der positiven Unendlichkeit am nächsten kommt) zurückgegeben, der kleiner oder gleich dem algebraischen Quotienten ist.
Einige Beispiele:
floorDiv(4, 3) == 1
floorDiv(-4, 3) == -2
Alternativ kann der /
Operator verwendet werden:
(4 / 3) == 1
(-4 / 3) == -1
Verweise:
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, das ist vielleicht spät, aber ich denke, der beste und genauere Ansatz ist die Verwendung von 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
wir über Ein- und Ausgaben sprechen, setzen Sie Wert und erhalten Sie Ihren Wert zurück, ohne 0,001% davon zu verlieren! und das genau, nicht irreführend!
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);
}
}