【发布时间】:2018-10-30 19:53:49
【问题描述】:
我正在用 Java 制作货币转换应用程序。其他一些很棒的 StackOverflowians 建议我阅读 BigDecimal 以替换 double 以解决任何精度问题。
我有两个方法系统;它从起始货币转换为美元,然后将美元价值转换为目标货币。
注意,我的转化率是这样存储的:
// Conversion Rates - START (as of October 30, 2018 @ 3:19 AM)
// Rates obtained from exchange-rates.org
//Convert to United States Dollar rates
private final BigDecimal CAD_TO_USD = new BigDecimal(0.76135);
private final BigDecimal EUR_TO_USD = new BigDecimal(1.1345);
private final BigDecimal YEN_TO_USD = new BigDecimal(0.008853);
// Conversion Rates - END
在我用它们各自的 BigDecimal 替换我的双打后 - 我决定对其进行测试,看看效果如何。
我的测试器类运行以下方法来启动转换过程。
public BigDecimal convert()
{
BigDecimal value;
value = convertToUSD(); //Converts the current currency into USD
value = convertFromUSD(value); //Converts the previous USD currency value into the destination currency
return value;
}
当我输入我的样本变量(将 2.78 日元转换为加元)时,我逐步完成了整个过程,发现一切正常,直到我返回一个值。
从前面提到的方法中,convertToUSD() 被运行并且编码如下
private BigDecimal convertToUSD()
{
switch (fromCurrency)
{
case "USD":
return fromQuantity.multiply(new BigDecimal(1));
case "CAD":
return fromQuantity.multiply(CAD_TO_USD);
case "EUR":
return fromQuantity.multiply(EUR_TO_USD);
case "YEN":
return fromQuantity.multiply(YEN_TO_USD);
}
return new BigDecimal(0);
}
所有值都正确传递,它逐步向下到正确的大小写(“YEN”),变量窗格显示“fromQuantity”BigDecimal 的 intCompact 值为 278(这对我来说很有意义)
一旦断点返回到“convert”方法,它就会变得一团糟。它不是返回2.78 * 0.008853 = 0.0246,而是返回-9223372036854775808。
这会导致所有其他计算产生错误。
我是使用 BigDecimal 的新手,所以我可能会犯一个完全明显的错误;但是我很高兴学习,所以我向你们寻求建议:)
感谢任何帮助。
【问题讨论】:
-
不要使用带双精度的构造函数。使用带字符串的那个。 double 值不会像您想象的那样映射到 BigDecimal。不确定这是你唯一的问题,但它会让你的开始很糟糕。
-
-9223372036854775808 的 intCompact 值为 Long::MIN_VALUE。如果它具有该值,则意味着不应使用它来计算 BigDecimal 值,并且 BigInteger intVal 包含 BigDecimal 的实际数字。因此,尽管您使用双精度数来初始化 BigDecimal,但它们的值可能不准确,但不应与事实相差太远。 不管怎样,intCompact 中的值在这里没有意义。该值只是忽略 intCompact 的标志。。您可以使用
System.out.println(value);检查 BigDecimal 的实际值。
标签: java precision bigdecimal