在我的程序中,我将付款金额值发布到控制器,并且我将该值转换为整数。因为我需要在调用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等......这可能是造成这个问题的原因?
答案 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();