题
我正在尝试获取两个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%>
解决方案
问题出在以下一行
long tmp = 600/500;
您不能长时间存储浮点数,而应考虑使用以下代码:
double tmp = (double)600 / (double)500;
然后显示tmp,其值应介于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
然而,打印double / float divison的结果通常会有多于你想要的小数位,即使它们不应该在结果中(例如 1/10
会导致 0.100000001490116119384765625
),由于这些数字存储为二进制分数的方式
您可以使用 java.lang.DecimalFormat
消除这些不需要的数字,但 BigDecimal
是一个更好的选项,因为它在内部使用小数分数,因此会实际传递在提供对舍入模式的精确控制的同时获得正确结果当然,这要求您使用 BigDecimal
进行计算,而不是使用“voodoo成分”。修复已经破裂的结果。
new BigDecimal(600).divide(new BigDecimal(500))
阅读 BigDecimal的 API文档
了解更多信息。