在JSP中计算和显示浮点数

时间:2009-04-30 08:34:25

标签: java jsp floating-point

我正在尝试获取两个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%>

3 个答案:

答案 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是整数值,它们之间的除法将有一个整数结果,您可以将其分配给一个长整数。在此之后,结果的小数部分消失了(两次),你无法取回它。

为了得到小数结果,除法的至少一个输入值必须是非整数。你可以通过将它们转换为doublefloat,或者通过使文字明确地加倍或浮动来实现这一点:

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了解更多信息。