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);
Вы просто создаете новый экземпляр и не используете его.