работа с деньгами и большими десятичными дробями

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

 24
 or
 24.0
 or
 24.00

так что, как вы можете видеть, я даю пользователю возможность печатать по своему усмотрению. Но, в конце концов, переменная будет храниться в массиве (массив BigDecimal), поэтому при ее сохранении я хочу сохранить только 2 десятичных знака. Почему я говорю, что если пользователь вводит 24, я хочу сохранить 24.00 НЕ 24 или 24.0 ТОЛЬКО 24.00, или если он вводит 24.00, то это будет сохранено без каких-либо изменений, внесенных в него.. как это сделать.. Предоставлен пример кода ниже.

    BigDecimal bala;
    BigDecimal balintake;
    static BigDecimal[] bal= new BigDecimal[20];
    Scanner sc = new Scanner(System.in);
    balintake = sc.nextBigDecimal();

     bala.setScale(2,RoundingMode.HALF_UP);
     bal[0] = bala;

Но это не работает в соответствии с моими требованиями.


person JackyBoi    schedule 22.08.2012    source источник
comment
Если я правильно понял, вас больше заботит то, что отображается, чем то, что сохраняется, верно? Если это так, вы можете контролировать точность во время печати (в зависимости от того, где вы печатаете, то есть на консоли или в каком-либо пользовательском интерфейсе).   -  person Vikdor    schedule 22.08.2012
comment
@Vikdor Vikdor, эй, чувак, мне нужно выполнить поиск в массиве bigdecimal позже, другим методом ... так что мне также нужно сделать то же самое, дать пользователю гибкость, а затем преобразовать в 2 десятичных разряда, поскольку это то, что хранится в поиске. Так что в целом я пытаюсь сделать его стандартизированным.   -  person JackyBoi    schedule 22.08.2012
comment
Не могли бы вы просто сохранить свои значения как целые числа, например. 2400? Тогда вам просто нужно беспокоиться о преобразовании в/из этого целочисленного значения из возможных десятичных представлений, предоставленных пользователем.   -  person Duncan Jones    schedule 22.08.2012
comment
Вы можете использовать DecimalFormat для этого требования....   -  person Vinesh    schedule 22.08.2012


Ответы (3)


Помните, что объекты BigDecimal неизменяемы. Итак, когда вы делаете

balintake.setScale(2,RoundingMode.HALF_UP);

вы должны назначить его обратно переменной, например

balintake = balintake.setScale(2,RoundingMode.HALF_UP);
person allotria    schedule 22.08.2012

java.math.BigDecimal .setScale(int) возвращает новый BigDecimal вместо изменения исходного.

Обратите внимание, что, поскольку объекты BigDecimal неизменяемы, вызовы этого метода не приводят к изменению исходного объекта, в отличие от обычного соглашения о том, что методы с именем setX изменяют поле X. Вместо этого setScale возвращает объект с правильным масштабом; возвращаемый объект может быть или не быть заново выделенным.

person Lauri Piispanen    schedule 22.08.2012

Во-первых, вы никогда не инициализировали переменную "bala"

Таким образом, вы устанавливаете «balintake» как следующую большую десятичную дробь Сканера. Метод setScale не изменяет сам BigDecimal, поскольку BigDecimal неизменяем, он возвращает новый BigDecimal с установленным масштабом.

Я считаю, что это то, что вы хотите:

BigDecimal balintake;
BigDecimal[] bal= new BigDecimal[20];
Scanner sc = new Scanner(System.in);
balintake = sc.nextBigDecimal();

balintake = balintake.setScale(2,RoundingMode.HALF_UP);
bal[0] = balintake;
person Transcendence    schedule 22.08.2012