Как преобразовать строку с десятичными знаками в BigDecimal и сохранить десятичные дроби в Talend Java? - PullRequest
0 голосов
/ 05 октября 2018

Я создаю задание в Talend для преобразования данных из файла .csv, используя некоторые данные из базы данных, а затем включаю их в другой файл .csv.Во время преобразования необходимо выполнить некоторые вычисления для значений:

value1 / value2 * value3

Value1 берется из файла .csv и по умолчанию являетсяСтрока, представляющая сумму, например

"15,25"

Значения 2 и 3 взяты из базы данных и представляют собой BigDecimals с 4 десятичными разрядами.Результат вычисления должен быть округлен до 2 десятичных знаков.

Мой вопрос: Как преобразовать данные из файла .csv, чтобы их можно было вычислить с помощью BigDecimals из базы данных?

Если я преобразую любой тип данных в BigDecimal, он теряет десятичные дроби, например, из String: BigDecimal n = new BigDecimal ("15.25"). Результат всегда будет

15

Я пытался сделать это с помощью математического контекста ROUND_UNNECESSARY и setScale, но это, похоже, не актуально в этих случаях.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Спасибо за ваши ответы, я нашел решение: Моя ошибка при попытке выполнить выше была в том, что я экспортировал

новый BigDecimal ("15.25")

вCSV-файл, а затем положить это поле в расчет.Очевидно, Talend преобразует правильно преобразованный BigDecimal в «15», если я не использую .toString ().Таким образом, после преобразования примерного «15,25» в BigDecimal и не помещая его в файл .csv, приведенная ниже формула добилась цели

(((v1).multiply(v2)).divide(v3, 2, java.math.RoundingMode.HALF_UP)).toString()

Спасибо @ peter-lawrey

0 голосов
/ 05 октября 2018

Вы можете использовать BigDecimal

BigDecimal v1 = new BigDecimal("15.25");
BigDecimal v2 = new BigDecimal("5.25");
BigDecimal v3 = new BigDecimal("1.15");

BigDecimal v123 = v1.divide(v2, MathContext.DECIMAL64).multiply(v3);

System.out.println(v123);
System.out.println(v123.setScale(2, RoundingMode.HALF_UP));

отпечатки

3.34047619047619075
3.34

Для выполнения этого расчета с использованием double

double v1 = 15.25;
double v2 = 5.25;
double v3 = 1.15;
double v123 = v1 / v2 * v3;
System.out.println(v123);
System.out.printf("%.2f%n", v123);

отпечатков

3.34047619047619
3.34

Если бы использовался MathContext.DECIMAL128, необоснованным значением было бы

3.340476190476190476190476190476191

и в этом примере , оба решения более чем достаточно точны.

...