package com.zzg.common.utils;
|
|
import java.lang.reflect.Field;
|
import java.math.BigDecimal;
|
import java.util.List;
|
|
public class RoundingUtil {
|
|
/**
|
* 对象中所有的 Double 类型字段进行四舍五入保留两位小数。
|
* @param obj 目标对象
|
*/
|
public static void roundDoubleFields(Object obj) {
|
if (obj == null) {
|
return;
|
}
|
|
Field[] fields = obj.getClass().getDeclaredFields();
|
for (Field field : fields) {
|
field.setAccessible(true);
|
try {
|
Object value = field.get(obj);
|
|
// 处理 Double 类型字段
|
if (value instanceof Double) {
|
field.set(obj, round((Double) value));
|
}
|
|
// 如果是其他的自定义对象,则递归处理
|
else if (isCustomObject(value)) {
|
roundDoubleFields(value);
|
}
|
|
// 如果是 List 类型,并且其中是自定义对象,也需要递归处理
|
else if (value instanceof List) {
|
List<?> list = (List<?>) value;
|
for (Object item : list) {
|
if (isCustomObject(item)) {
|
roundDoubleFields(item);
|
}
|
}
|
}
|
} catch (IllegalAccessException e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
|
/**
|
* 判断对象是否是自定义类,而非基本类型或库类型。
|
* @param obj 被判断的对象
|
* @return 是否是自定义对象
|
*/
|
private static boolean isCustomObject(Object obj) {
|
if (obj == null) {
|
return false;
|
}
|
String className = obj.getClass().getName();
|
return !className.startsWith("java.") && !className.startsWith("javax.") && !className.startsWith("org.") && !className.startsWith("com.alibaba.fastjson.");
|
}
|
|
/**
|
* 将 Double 类型进行四舍五入,保留两位小数。
|
* @param value 要四舍五入的值
|
* @return 处理后的值
|
*/
|
private static Double round(Double value) {
|
if (value == null) {
|
return null;
|
}
|
return BigDecimal.valueOf(value)
|
.setScale(2, BigDecimal.ROUND_HALF_UP)
|
.doubleValue();
|
}
|
}
|