在java中,将美元(大十进制)转换为美分(整数)的最佳方法是什么?

在java中,将美元(大十进制)转换为美分(整数)的最佳方法是什么?,java,integer,type-conversion,bigdecimal,Java,Integer,Type Conversion,Bigdecimal,我必须将我的web应用程序与支付网关集成。我想输入以美元表示的总金额,然后将其转换为美分,因为我的支付网关库接受以美分表示的金额(类型为Integer)。我发现java中的大十进制是操纵货币的最佳方式。目前,我将输入值转换为50美元,并将其转换为整数,如下所示: BigDecimal rounded = amount.setScale(2, BigDecimal.ROUND_CEILING); BigDecimal bigDecimalInCents = rounded.multiply(new

我必须将我的web应用程序与支付网关集成。我想输入以美元表示的总金额,然后将其转换为美分,因为我的支付网关库接受以美分表示的金额(类型为
Integer
)。我发现java中的
大十进制
是操纵货币的最佳方式。目前,我将输入值转换为50美元,并将其转换为整数,如下所示:

BigDecimal rounded = amount.setScale(2, BigDecimal.ROUND_CEILING);
BigDecimal bigDecimalInCents = rounded.multiply(new BigDecimal("100.00"));
Integer amountInCents = bigDecimalInCents.intValue();

这是将美元兑换成美分的正确方法,还是我应该用其他方法?

包含我以下观点的最简单方法是:

public static int usdToCents(BigDecimal usd) {
    return usd.movePointRight(2).intValueExact();
}
我建议您使用
intValueExact
,因为如果信息丢失(如果您处理的交易金额超过21474836.47美元),这将引发异常。这也可用于捕获丢失的分数

我也会考虑接受一分钱和一分钱的价值是否正确。我会说不,客户机代码必须提供有效的计费金额,因此,如果我需要自定义异常,我可能会这样做:

public static int usdToCents(BigDecimal usd) {
    if (usd.scale() > 2) //more than 2dp
       thrown new InvalidUsdException(usd);// because was not supplied a billable USD amount
    BigDecimal bigDecimalInCents = usd.movePointRight(2);
    int cents = bigDecimalInCents.intValueExact();
    return cents;
}

你也应该考虑最小化<代码>舍入错误< /代码>。

int amountInCent = (int)(amountInDollar*100 + 0.5);
LOGGER.debug("Amount in Cents : "+ amountInCent );

上述解决方案可能会对您有所帮助。

此解决方案因负值而失败。例如,尝试-4.56,您将得到-455。@Yeshwantkota测试了它,但事实并非如此。请详细说明<代码>系统输出打印项次(usdToCents(BigDecimal.valueOf(-456,2));系统输出打印项数(usdToCents(BigDecimal.valueOf(-4.56))都显示
-4.56
@weston:在上面的响应中,您尝试了BigDecimal.valueOf(-4.56),这使-4.56成为一个双值。尝试使用System.out.println(“值为BigDecimal:+usdToCents(新的BigDecimal(-4.56));我想你使用了与我提供的不同的代码,因为我得到了一个异常<代码>线程“main”java.lang.ArtihmeticException中的异常:java.math.BigDecimal.commonNeedIncrement(BigDecimal.java:4148)在java.math.BigDecimal.needIncrement(BigDecimal.java:4355)在java.math.BigDecimal.DivideAndRond(BigDecimal.java:4330)在java.math.BigDecimal.BigDecimal位于com.example.Main.usdToCents(Main.java:15)@weston:谢谢