سؤال

وأنا أحاول أن تأخذ اثنين من 7 أرقام أرقام (المصدر والهدف التهم رقم قياسي) وحساب النسبة المئوية للسجلات المفقودين في العد الهدف.

وعلى سبيل المثال، يا التهم سجل يمكن أن يكون 4084094 لمصدر، و4081313 لهدف. أنا أيضا باستخدام الصيغة متابعة لاحسب النسبة المئوية: ((1 - (الهدف / المصدر)) * 100)

لبلدي على سبيل المثال، يجب أن أحصل على قيمتها نحو 0.0681٪

وأنا لست جديدا على جافا وJSP، وأنا لست قادرا على الحصول على نسبة مئوية للعرض بشكل صحيح. ويبدو لي أن تحصل فقط قيمة تقريب وصولا الى 0.

ولقد حاولت ايضا BigDecimal، ولكن دون جدوى.

وحتى رمز بسيط التالية يعرض قيمة 1-1، لذلك من الواضح أنني أفعل سومثينغ خطأ على محمل الجد:

<%
BigDecimal percentMiss;
long tmp = 600/500;
percentMiss = BigDecimal.valueOf(tmp);
%>
<%=percentMiss.toString()%>-<%=tmp%>
هل كانت مفيدة؟

المحلول

والمشكلة هي في السطر التالي

long tmp = 600/500;

ولا يمكنك تخزين أرقام الفاصلة العائمة في فترة طويلة، بدلا من ذلك يجب عليك أن تنظر باستخدام التعليمات البرمجية التالية:

double tmp = (double)600 / (double)500;

وثم عرض تمة، التي ينبغي أن يكون لها قيمة في مكان ما بين 0 و 1 (في قضيتك 1.2، وذلك لأن لديك لتغيير الحساب الخاص بك إلى 500/600)

نصائح أخرى

والمشكلة هي من الواضح أنك تقسيم رقمين طويلة.

وأود أن أوصي باستخدام DecimalFormat لعرض الرقم. إذا كنت تستخدم JSTL، ثم حل حتى أفضل استخدام في علامات شكل :

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<fmt:formatNumber value="${value}" minFractionDigits="2" maxFractionDigits="2"/>

والمشكلة هي أن 600 و 500 هي القيم صحيح، وسوف تقسيم بينهما يكون لها نتيجة صحيحا، التي تقوم بتعيينها إلى عدد صحيح طويل. بعد ذلك، ذهب الجزء الكسري للنتيجة (مرتين) والتي لا يمكن الحصول عليها مرة أخرى.

في أجل الحصول على نتيجة كسور، واحد على الأقل من قيم الإدخال لقسم يجب أن يكون غير صحيح. يمكنك تحقيق ذلك من خلال صب لهم double أو float، أو من خلال جعل الحرفية ضعف صراحة أو تطفو مثل هذا:

500.0 // implicitly double
500f // float literal
500d // double literal

ولكن، الطباعة نتيجة لضعف تعويم دوري الدرجة / وغالبا ما يكون أكثر الأماكن العشرية مما تريد حتى لو كان لا ينبغي لها أن تكون في البحث (على سبيل المثال 1/10 يمكن أن يؤدي إلى 0.100000001490116119384765625)، نظرا ل<أ href = على "HTTP : //en.wikipedia.org/wiki/Floating_point#Accuracy_problems "يختلط =" نوفولو noreferrer "> الطريقة التي يتم بها تخزين هذه الأرقام كما كسور الثنائية

ويمكنك قضاء على هذه الأرقام غير المرغوب فيها باستخدام java.lang.DecimalFormat، ولكن BigDecimal الخيار الأفضل، لأنه يستخدم داخليا الكسور العشرية، وبالتالي سوف تسليم النتائج الصحيحة في الواقع حين تقدم السيطرة الدقيقة على وسائل التقريب. وبطبيعة الحال، وهذا يتطلب منك استخدام BigDecimal لحساب نفسه، بدلا من أن "العنصر الفودو" لإصلاح نتيجة كسر بالفعل.

new BigDecimal(600).divide(new BigDecimal(500))

href="http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html" rel="nofollow لBigDecimal لمزيد من المعلومات.

scroll top