字符串到整数转换提供错误的输出

时间:2016-02-04 22:33:04

标签: java string integer

在我的程序中,我将付款金额值发布到控制器,并且我将该值转换为整数。因为我需要在调用Web服务之前将此值转换为美分。 我使用java并将String转换为下面给出的整数代码

(int)(Double.parseDouble(httpRequest.getParameter(PAYMENT_AMOUNT).trim()) * 100);

payment.jsp

页面看起来像这样

Payment Amount: <input type="text" id="paymentAmount" name="paymentAmount" value="1.00" />

对于许多输入值,它会给出正确的输出。

但是对于像8.03这样的某些值作为输入,它返回802作为输出值。这发生在9.03,9.04,10.03,10.04,11.03等......这可能是造成这个问题的原因?

3 个答案:

答案 0 :(得分:2)

您需要对结果进行舍入。您遇到的问题是浮点数几乎不是打印成字符串时显示的数字。执行计算时,这会显示为问题。

我建议你试试

(int) Math.round( Double.parseDouble( httpRequest.getParameter(PAYMENT_AMOUNT).trim()) * 100);

在您的特定情况下,您可以使用BigDecimal查看double的实际表示是什么

double d = 8.03;
BigDecimal bd = new BigDecimal(d);
System.out.println("bd: " + bd);
double d100 = d * 100;
System.out.println("d100: " + d100);
int i100 = (int) d100;
System.out.println("i100: " + i100);
int r100 = (int) Math.round(d100);
System.out.println("r100: " + r100);

打印

bd: 8.0299999999999993605115378159098327159881591796875
d100: 802.9999999999999
i100: 802
r100: 803

因此,您可以看到8.03的实际值略低于8.03,这意味着当您* 100并将向下时,它意味着您按预期获得802而不是803

最佳解决方案是舍入结果,找到最接近的可表示值。

答案 1 :(得分:1)

作为旁注,您可能需要重新考虑使用int类型来处理大数字时的分值esp。

要在Java中的浮点问题的早期答案中添加更多内容,以及需要BigDecimal,请参考以下解释:

http://www.drdobbs.com/jvm/javas-floating-point-imprecision/240168744

您可以将代码更改为:

(new BigDecimal(httpRequest.getParameter(PAYMENT_AMOUNT).trim(), MathContext.DECIMAL64)).multiply(new BigDecimal(100, MathContext.DECIMAL64)).intValue()

另一个注意事项:我会谨慎地假设你会在esp上面的getParameter()调用中得到一个String对象。如果有人试图在不传递PAYMENT_AMOUNT参数的情况下调用您的服务。

答案 2 :(得分:-2)

您可以使用java.text.NumberFormat,如下所示:

NumberFormat format = NumberFormat.getInstance();
Number number = format.parse("8.03");
double d = number.doubleValue();