Я делаю приложение для конвертации валют на 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
После того, как я заменил свои двойники соответствующими BigDecimals - я решил проверить это и посмотреть, как все это работает.
Мой класс тестера запускает следующий метод для запуска процесса преобразования.
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);
}
ALl значения передаются правильно, он переходит вниз к правильному регистру ("YEN"), а область переменных показывает, что BigDecimal fromQuantity имеет значение intCompact 278 (что имеет смысл для меня)
Как только точка останова возвращается обратно к методу "convert", она все испортила. Вместо возврата 2.78 * 0.008853 = 0.0246
возвращается -9223372036854775808
.
Это приводит к возникновению всех других вычислений и возникновению ошибки.
Я новичок в использовании BigDecimal, поэтому, возможно, я делаю совершенно очевидную ошибку; но я счастлив учиться, поэтому я искал совета у вас, ребята:)
Любая помощь приветствуется.