Berechnen und Anzeigen Gleitkommazahlen in JSP
-
03-07-2019 - |
Frage
Ich versuche, zwei 7 Ziffern zu nehmen (Quelle und Rekordzahl Ziel) und den Prozentsatz des fehlenden Datensätze in der Zielzahl zu berechnen.
Zum Beispiel könnte mein Rekord zählt 4084094 für die Quelle sein, und 4081313 für das Ziel. Ich verwende auch die folgende Formel den Prozentsatz berechnet: ((1 - (Ziel / Quelle)) * 100)
Für mein Beispiel, ich sollte den Wert von etwa 0,0681% erhalten
Ich bin bin neu in Java und JSP, und ich bin nicht in der Lage um den Prozentsatz zu erhalten korrekt anzuzeigen. Ich scheine nur ein Wert erhalten auf 0 abgerundet.
Ich habe auch versucht BigDecimal, ohne Erfolg.
Auch der folgende einfache Code zeigt den Wert von 1-1, so dass ich somthing offensichtlich tue ernsthaft falsch:
<%
BigDecimal percentMiss;
long tmp = 600/500;
percentMiss = BigDecimal.valueOf(tmp);
%>
<%=percentMiss.toString()%>-<%=tmp%>
Lösung
Das Problem ist in der folgenden Zeile
long tmp = 600/500;
Sie können nicht speichern Punktzahl in einem langen schwimmen, stattdessen sollten Sie den folgenden Code:
double tmp = (double)600 / (double)500;
und dann angezeigt tmp, die einen Wert irgendwo zwischen 0 und 1 (in Ihrem Fall 1.2, weil Sie Ihre Berechnung auf 500/600 ändern müssen)
haben solltenAndere Tipps
Das Problem ist offensichtlich, dass Sie zwei lange Zahlen sind geteilt wird.
Ich würde empfehlen, mit DecimalFormat die Nummer anzuzeigen. Wenn Sie JSTL verwenden, dann eine noch bessere Lösung ist es, die Format-Tags :
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<fmt:formatNumber value="${value}" minFractionDigits="2" maxFractionDigits="2"/>
Ihr Problem ist, dass 600 und 500 ganzzahlige Werte sind, und eine Trennung zwischen ihnen wird eine ganze Folge haben, die Sie auf eine lange ganze Zahl zuweisen. Danach wird der Bruchteil des Ergebnisses gegangen (zweimal) und man kann es nicht zurück.
Um ein Bruchergebnis zu bekommen, zumindest einen der Eingangswerte des Geschäftsbereichs muss nicht ganzzahligen sein. Sie können dies erreichen, indem sie dem Gießen double
oder float
, oder indem sie die Literale explizit doppelte oder schweben wie folgt aus:
500.0 // implicitly double
500f // float literal
500d // double literal
Allerdings Druck das Ergebnis eines Doppel / float Divison haben oft mehr Dezimalstellen als Sie selbst wollen, wenn sie im Ergebnis nicht sein sollte (zB 1/10
in 0.100000001490116119384765625
führen kann), aufgrund die Art, wie diese Zahlen gespeichert werden als Binärbrüche
Sie können diese unerwünschten Stellen beseitigen, indem java.lang.DecimalFormat
verwenden, aber BigDecimal
ist eine bessere Option, da sie intern Dezimalbrüchen verwendet und wird daher die eigentlich korrekte Ergebnisse liefern, während genaue Kontrolle über die Rundung Modi bietet. Natürlich erfordert dies Sie BigDecimal
für die Berechnung zu verwenden, selbst, anstatt als „Voodoo-Bestandteil“ ein bereits gebrochenes Ergebnis zu beheben.
new BigDecimal(600).divide(new BigDecimal(500))
Lesen Sie die API-Dokumentation für BigDecimal
für weitere Informationen.