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

时间:2018-10-05 07:59:51

标签: java string type-conversion talend bigdecimal

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

  

值1 /值2 *值3

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

  

“ 15.25”

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

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

如果我将任何数据类型转换为BigDecimal,它将丢失小数,例如String:     BigDecimal n =新的BigDecimal(“ 15.25”) 结果永远是

  

15

我尝试使用数学上下文ROUND_UNNECESSARY和setScale进行此操作,但是在这种情况下这似乎无关紧要。

2 个答案:

答案 0 :(得分:3)

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

在此示例中,这两种解决方案都不够准确。

答案 1 :(得分:0)

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

新的BigDecimal(“ 15.25”)

.csv文件,然后将此字段放入计算中。除非我使用.toString(),否则显然Talend正在将正确转换的BigDecimal转换为“ 15”。因此,在将示例性的“ 15.25”转换为BigDecimal并将其不放入.csv文件后,下面的公式就可以解决问题

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

谢谢@ peter-lawrey