我正在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进行此操作,但是在这种情况下这似乎无关紧要。
答案 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