java - 如何在 Talend Java 中将带小数的字符串转换为 BigDecimal 并保留小数?
问题描述
我正在 Talend 中创建一个作业,以使用数据库中的一些数据转换 .csv 文件中的数据,然后将其合并到另一个 .csv 文件中。在转换期间,需要对值执行一些计算:
值1 / 值2 * 值3
Value1 取自 .csv 文件,默认为表示金额 fe 的字符串
“15.25”
值 2 和 3 取自数据库,是具有 4 位小数的 BigDecimal。计算结果必须四舍五入到小数点后 2 位。
我的问题是:如何转换 .csv 文件中的数据,以便可以使用数据库中的 BigDecimals 进行计算?
如果我将任何数据类型转换为 BigDecimal 它会丢失小数,来自 String: 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
在这个例子中,两种解决方案都足够准确。
推荐阅读
- python-behave - 即使安装了“cucumber-tag-expressions 3.0.0”,带有“and”和“or”运算符的行为命令也不起作用
- python - 将 python pygame 转换为 exe 的问题
- c++ - decltype(std::get<0>(tup)) 到底是什么?
- python - 如何检查一个对象是否是某个 PyTorch 优化器?
- c - 使用 C 的 Skiplist 实现
- reactjs - 如何使用 Hooks 在 Reactjs 页面之间传递数据?
- html - 如何更改引导列的背景颜色
- r - 如何在 Jupyter lab .ipynb 文件中处理 R 内核 tibble 以显示有限的行结果?
- postgresql - 无法连接到位于 docker 容器中的数据库
- python - 在循环中根据 arr[i] 的值制作 python 列表的一部分