如何在 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
我正在 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