首页 > 解决方案 > 如何在 Talend Java 中将带小数的字符串转换为 BigDecimal 并保留小数?

问题描述

我正在 Talend 中创建一个作业,以使用数据库中的一些数据转换 .csv 文件中的数据,然后将其合并到另一个 .csv 文件中。在转换期间,需要对值执行一些计算:

值1 / 值2 * 值3

Value1 取自 .csv 文件,默认为表示金额 fe 的字符串

“15.25”

值 2 和 3 取自数据库,是具有 4 位小数的 BigDecimal。计算结果必须四舍五入到小数点后 2 位。

我的问题是:如何转换 .csv 文件中的数据,以便可以使用数据库中的 BigDecimals 进行计算?

如果我将任何数据类型转换为 BigDecimal 它会丢失小数,来自 String: BigDecimal n = new BigDecimal("15.25") 结果总是

15

我也尝试用数学上下文 ROUND_UNNECESSARY 和 setScale 来做,但这在这种情况下似乎无关紧要。

标签: javastringtype-conversiontalendbigdecimal

解决方案


您可以使用 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

在这个例子中,两种解决方案都足够准确。


推荐阅读