【问题标题】:String to Integer Converting gives wrong output字符串到整数转换给出错误的输出
【发布时间】:2016-02-04 22:33:04
【问题描述】:

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

(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 等......这个问题的原因可能是什么?

【问题讨论】:

    标签: java string integer


    【解决方案1】:

    您需要对结果进行四舍五入。您遇到的问题是浮点数几乎但不完全是打印为字符串时出现的数字。这会在您执行计算时显示为一个问题。

    建议你试试

    (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 而不是@ 987654329@ 符合预期。

    最好的解决方案是对结果进行四舍五入,找到最接近的可表示值。

    【讨论】:

    • 谢谢。它的工作。并感谢您的解释
    【解决方案2】:

    附带说明一下,您可能需要重新考虑使用 int 类型来存储分值,尤其是在处理大数字时。

    要添加更多关于 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()
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-25
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 2018-10-15
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多