首页 文章

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

提问于
浏览
-2

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

value1 / value2 * value3

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

“15.25”

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

My question is: How to convert data from .csv file so that it could be calculated with BigDecimals from database?

如果我将任何数据类型转换为BigDecimal,它将丢失小数,f.e来自String:BigDecimal n = new BigDecimal(“15.25”)结果将始终为

15

我试图用数学上下文ROUND_UNNECESSARY和setScale来做,但在这种情况下这似乎不相关 .

2 回答

  • 3

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

    新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

  • 0

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

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

相关问题