Wie bekomme ich ganze und gebrochene Teile von Double in JSP / Java?



Answers

double value = 3.25;
double fractionalPart = value % 1;
double integralPart = value - fractionalPart;
Question

Wie bekomme ich ganze und gebrochene Teile von Double in JSP / Java? Wenn der Wert 3,25 ist, dann möchte ich fractional =.25 , whole = 3

Wie können wir das in Java machen?




Die Mantisse und der Exponent einer IEEE-Doppel-Gleitkommazahl sind die Werte, die

value = sign * (1 + mantissa) * pow(2, exponent)

wenn die Mantisse die Form 0.101010101_base 2 hat (dh, ihr höchstwertiges Bit wird nach dem Binärpunkt verschoben) und der Exponent wird auf Bias eingestellt.

Seit Version 1.6 bietet java.lang.Math auch eine direkte Methode zum Erhalten des unverzerrten Exponenten (getExponent (double) genannt)

Die Zahlen, nach denen Sie fragen, sind jedoch die ganzzahligen und gebrochenen Teile der Zahl, die Sie erhalten können, indem Sie

integral = Math.floor(x)
fractional = x - Math.floor(x)

obwohl Sie vielleicht negative Zahlen anders behandeln wollen (floor(-3.5) == -4.0) , je nachdem, warum Sie die beiden Teile wollen.

Ich würde stark empfehlen, dass Sie diese Mantisse und den Exponenten nicht nennen.




Weiß nicht, ob das schneller ist, aber ich benutze

float fp = ip % 1.0f;



Die ursprüngliche Frage bestand eher aus dem Exponenten und der Mantisse als aus dem Bruchteil und dem ganzen Teil.

Um den Exponenten und die Mantisse von einem Double 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;



Die akzeptierte Antwort funktioniert bei negativen Zahlen zwischen -0 und -1.0 nicht gut. Geben Sie auch den Bruchteil negativ.

Zum Beispiel: Für die Zahl -0,35

kehrt zurück

Ganzzahliger Teil = 0 Fraktionaler Teil = -0,35

Wenn Sie mit GPS-Koordinaten arbeiten, ist es besser, ein Ergebnis mit dem Signum auf dem ganzzahligen Teil zu haben:

Ganzzahliger Teil = -0 Bruchteil = 0,35

Diese Zahlen werden zum Beispiel für GPS-Koordinaten verwendet, wo das Signum für Lat- oder Long-Position wichtig ist.

Vorschlagscode:

    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



Ich würde BigDecimal für die Lösung verwenden. So was:

    double value = 3.25;
    BigDecimal wholeValue = BigDecimal.valueOf(value).setScale(0, BigDecimal.ROUND_DOWN);
    double fractionalValue = value - wholeValue.doubleValue();



Da das fmt:formatNumber Tag nicht immer das richtige Ergebnis liefert, gibt es hier einen weiteren JSP-Ansatz: Es formatiert die Zahl einfach als String und führt den Rest der Berechnung auf der Zeichenfolge aus, da dies einfacher ist und keine Auswirkungen hat. weitere Gleitkommaarithmetik.

<%@ 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>



Ganzzahliger Teil kommt vom einfachen Casting und für die Bruchteilspaltung:

double value = 123.004567890
int integerPart;
int fractionPart;
/**
* To control zeroes omitted from start after parsing.
*/
int decimals;

integerPart = (int) value; // 123

fractionPart = 
  Integer.valueOf(
    String.valueOf(value)
      .split(".")
      [1]); // 004567890

decimals =
  String.valueOf(value)
      .split(".")
      [1]
      .length(); // 9





Links