如何在 Talend Java 中将带小数的字符串转换为 BigDecimal 并保留小数?

How to convert a String with decimals to BigDecimal and keep the decimals, in Talend Java?

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

value1 / value2 * value3

Value1 取自 .csv 文件,默认情况下是表示金额的字符串 f.e。

"15.25"

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

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

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

15

我也尝试过使用数学上下文 ROUND_UNNECESSARY 和 setScale 来做到这一点,但这在这种情况下似乎不相关。

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

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

感谢您的回答,我找到了解决方案: 尝试执行上述操作时我的错误是我导出了

new 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