我正在尝试获取两个7位数字(源记录和目标记录计数)并计算目标计数中缺失记录的百分比。
例如,我的记录计数源为4084094,目标为4081313。我也使用以下公式计算百分比:((1 - (目标/来源))* 100)
对于我的例子,我应该得到大约.0681%
的值我是Java和JSP的新手,我无法正确显示百分比。我似乎只得到一个向下舍入为0的值。
我也试过BigDecimal,但没有用。
即使以下简单的代码显示1-1的值,所以我显然做了一些严重的错误:
<%
BigDecimal percentMiss;
long tmp = 600/500;
percentMiss = BigDecimal.valueOf(tmp);
%>
<%=percentMiss.toString()%>-<%=tmp%>
答案 0 :(得分:3)
问题显然是你要划分两个长号。
我建议使用DecimalFormat来显示该号码。如果您使用的是JSTL,那么更好的解决方案是使用format tags:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<fmt:formatNumber value="${value}" minFractionDigits="2" maxFractionDigits="2"/>
答案 1 :(得分:2)
问题出在以下一行
long tmp = 600/500;
您不能长时间存储浮点数,而应考虑使用以下代码:
double tmp = (double)600 / (double)500;
然后显示tmp,其值应介于0和1之间(在您的情况下为1.2,因为您必须将计算更改为500/600)
答案 2 :(得分:2)
您的问题是600和500是整数值,它们之间的除法将有一个整数结果,您可以将其分配给一个长整数。在此之后,结果的小数部分消失了(两次),你无法取回它。
为了得到小数结果,除法的至少一个输入值必须是非整数。你可以通过将它们转换为double
或float
,或者通过使文字明确地加倍或浮动来实现这一点:
500.0 // implicitly double
500f // float literal
500d // double literal
但是,打印double / float divison的结果通常会有多于你想要的小数位,即使它们不应该在结果中(例如1/10
会导致0.100000001490116119384765625
),由于the way these numbers are stored as binary fractions。
您可以使用java.lang.DecimalFormat
消除这些不需要的数字,但BigDecimal
是更好的选择,因为它在内部使用小数部分,因此可以提供实际正确的结果,同时提供对舍入模式的精确控制。当然,这需要您使用BigDecimal
进行计算,而不是使用“伏都教成分”来修复已经破坏的结果。
new BigDecimal(600).divide(new BigDecimal(500))
阅读API documentation for BigDecimal
了解更多信息。