Java BigDecimal Behavior

Я программирую впервые с BigDecimals.

Почему поведение отличается в следующих двух программах

   1) BigDecimal d = new BigDecimal("2.01").setScale(4);
      System.out.println(d);
      Gives me : 2.0100

  And 

   2) BigDecimal d = new BigDecimal("2.01");
      d.setScale(4);
  System.out.println(d);  
      Gives me : 2.01

Почему это так?

Также у меня есть функциональность, где мне нужно сравнить строку в файле CSV с записью записи БД с использованием некоторого значения BigDecimal. Столбцы БД имеют тип БД как десятичный с различными масштабами, например, Количество - это столбец с масштабом, определенным как 4. Когда пользователь вводит значение количества как 2 в файле CSV, он получается следующим образом:

     BigDecimal q = new BigDecimal("2");
     which gives me big decimal with scale as 0 and precision as 1 with value as 2.

когда я получаю то же значение из БД, используя

      rs.getBigDecimal(54) where 54 is column index, 
  I get Big decimal with precision as 0 and scale as 4 with value as 2.0000

Теперь, когда мне нужно сравнить сотни записей в CSV во всех записях в БД, я думал о создании значения SHA1 для всех записей в БД и сравнил его со значением SHA1 содержимого записи CSV.
Однако я не понимаю, как получить одинаковое строковое представление двух больших десятичных чисел с одинаковым значением с разной точностью. Я знаю, что 2 и 2.0000 технически не одинаковы для компьютера, но для пользователей они одинаковы.
Так что я хочу иметь такое же представление о них. Я также пытался вычислить их хэш-коды, но они также отличаются, что является правильным, поскольку они в целом разные числа для компьютера.
Итак, как я могу иметь 2 как BigDecimal, конвертируемый в 2.0000 Bigdecimal, чтобы я мог получить то же самое представление String.

это действительно оказывается для меня блокирующим

2 ответа

Решение

Если я вас понимаю, вы пропустили назначение из результата setScale ();

d = d.setScale(4);

редактировать

Что касается вашего второго вопроса, вы можете вызвать stripTrailingZeros () -

d = d.stripTrailingZeros();

BigDecimal является неизменным. По телефону:

d.setScale(4);

Вы просто создаете новый экземпляр и не используете его.

Другие вопросы по тегам