2017-01-30 11 views
0

Что было бы лучшим способом изменить все эти двойные значения на BigDecimal? Наверное, я не понял, когда начал, я должен использовать BigDecimal для финансовых программ. Я новичок в Java и ценю любые отзывы.Double to BigDecimal Java

private static class TaxBracket { 

    final double minSalary; 
    final double maxSalary; 
    final double taxRate; 

    TaxBracket(double minSalary, double maxSalary, double taxRate) { 
     this.minSalary = minSalary; 
     this.maxSalary = maxSalary; 
     this.taxRate = taxRate; 
    } 
} 
private static TaxBracket[] singleFiler; 
static { 
    singleFiler = new TaxBracket[] 
     { 
      new TaxBracket(0.0, 9075.0, 0.10),  //Index 0 TierOne 
      new TaxBracket(9076.0, 36900.0, 0.15), //Index 1 TierTwo 
      new TaxBracket(36901.0, 89350.0, 0.25), //Index 2 TierThree 
      new TaxBracket(89351.0, 186350.0, 0.28),//Index 3 TierFour 
      new TaxBracket(186351.0, 405100.0, 0.33),//Index 4 TierFive 
      new TaxBracket(405101.0, 406750.0, 0.35),//Index 5 TierSix 
      new TaxBracket(406751.0, Double.MAX_VALUE, 0.396)//Index 6 TierSeven 
     }; 
} 
private static TaxBracket[] jointFiler; 
static { 
    jointFiler = new TaxBracket[] 
     { 
      new TaxBracket(0.0, 18150.0, 0.10),  //Index 0 TierOne 
      new TaxBracket(18151.0, 73800.0, 0.15), //Index 1 TierTow 
      new TaxBracket(73801.0, 148850.0, 0.25), //Index 2 TierThree 
      new TaxBracket(148851.0, 226850.0, 0.28),//Index 3 TierFour 
      new TaxBracket(226851.0, 405100.0, 0.33),//Index 4 TierFive 
      new TaxBracket(405101.0, 457600.0, 0.35),//Index 5 TierSix 
      new TaxBracket(457601.0, Double.MAX_VALUE, 0.396)//Index 6 TierSeven 
     }; 
} 
private static TaxBracket[] hohFiler; 
static { 
    hohFiler = new TaxBracket[] 
     { 
      new TaxBracket(0.0, 12950.0, 0.10),  //Index 0 TierOne 
      new TaxBracket(12951.0, 49400.0, 0.15), //Index 1 TierTow 
      new TaxBracket(49401.0, 127550.0, 0.25), //Index 2 TierThree 
      new TaxBracket(127551.0, 206600.0, 0.28),//Index 3 TierFour 
      new TaxBracket(206601.0, 405100.0, 0.33),//Index 4 TierFive 
      new TaxBracket(405101.0, 432200.0, 0.35),//Index 5 TierSix 
      new TaxBracket(432201.0, Double.MAX_VALUE, 0.396)//Index 6 TierSeven 
     }; 
+0

Возможный дубликат [Конвертировать double в BigDecimal и установить BigDecimal Precision] (http://stackoverflow.com/questions/12395281/convert-double-to-bigdecimal-and-set-bigdecimal-precision) – alfasin

+1

Сделайте вместо них строки и передать их конструктору 'BigDecimal'. – shmosel

+0

@alfasin Ничто не похоже на дубликат для меня. – EJP

ответ

1

Вы должны:

  1. Изменение double на BigDecimal везде влияет.
  2. Измените аргументы new TaxBracket(...), например. 9075.0 до new BigDecimal("9075.0") повсюду. Обратите внимание на цитаты. Если вы не укажете значения, вы ничего не решите.

В качестве альтернативы можно изменить аргументы конструктора для String и сделать new BigDecimal(...) внутри конструктора, который может быть аккуратнее.

+0

В действительности все это должно быть в базе данных как столбцы DECIMAL, а не в коде. – EJP

+0

@alfasin Нет такого метода, как 'BigDecimal.valueOf (String)' и 'BigDecimal.valueOf (double)' по-прежнему недействителен с точки зрения вопроса, а именно, о том, что он вообще не использует 'double' для финансовые расчеты. Вы не получите правильный ответ на ставку налога, например. 0.33, если он представлен как 'double' * в любом месте *, и я ожидал, что вы это уже знаете. Пожалуйста, продолжайте обсуждение дубликата, где он принадлежит, которого нет здесь. – EJP

+0

, когда вы используете предложения типа «читать вопрос» и «Я бы ожидал, что вы уже знаете это», это делает другую сторону маленькой. Может быть, вы это не имели в виду, но именно так люди будут чувствовать себя, когда кто-то говорит с ними так. Быть правильным важно, но, будучи способным сообщить об этом таким образом, чтобы это не повредило, чувства других также не являются незначительными. Желаю вам всего наилучшего! – alfasin

-1

Я рекомендую вам изменить 3 двойные переменные в верхней части вашего класса TaxBracket на BigDecimals. И в конструкторе для TaxBracket, используйте BigDecimal constructor that takes a double

Это должно выглядеть примерно так, когда вы сделали:

private static class TaxBracket { 

final BigDecimal minSalary; 
final BigDecimal maxSalary; 
final BigDecimal taxRate; 

TaxBracket(double minSalary, double maxSalary, double taxRate) { 
    this.minSalary = new BigDecimal(minSalary); 
    this.maxSalary = new BigDecimal(maxSalary); 
    this.taxRate = new BigDecimal(taxRate); 
} 
+0

Это не «изменяет все значения« double »на« BigDecimal »и поэтому не является ответом на вопрос. – EJP

0

Вы можете сделать это следующим образом (если вы хотите сохранить двойные значения в качестве входных данных):

void changeToBigDecimal(){ 
    BigDecimal minSalaryDec = new BigDecimal(this.minSalary, MathContext.DECIMAL64); 
    BigDecimal maxSalaryDec = new BigDecimal(this.maxSalary, MathContext.DECIMAL64); 
    BigDecimal taxRateDec= new BigDecimal(this.taxRate, MathContext.DECIMAL64); 
} 

И называют это после установки начальных значений в конструкторе. Если вы хотите, вы можете сделать их глобальными переменными вместо местных.

+0

Это не меняет все значения 'double' на' BigDecimal' и поэтому не является ответом на вопрос. – EJP