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%>
War es hilfreich?

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 sollten

Andere 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top