Freemarker保留double类型小数点后末尾零的实现方法
在Freemarker中保留带末尾零的数值格式
首先要明确:double类型本身不会存储小数部分末尾零的信息,比如1.0和1在内存中是完全相同的double值,这也是你用?string无法区分它们的原因。要实现需求,核心是让数据源保留原始数值的精度信息,具体可以按以下方式处理:
方法一:改用BigDecimal存储数值
在后端将double类型替换为BigDecimal,并且使用字符串构造器初始化(避免浮点数精度丢失),比如:
// 保留1.0的精度 BigDecimal num1 = new BigDecimal("1.0"); // 保留1.001的精度 BigDecimal num2 = new BigDecimal("1.001");
将这些BigDecimal对象传入Freemarker后,直接输出或使用?string指令即可原样显示:
${num1} <!-- 输出1.0 --> ${num2} <!-- 输出1.001 --> ${num1?string} <!-- 同样输出1.0 -->
方法二:后端转换为字符串传递
如果无法修改后端数值类型,可在后端将double值按原始格式转换为字符串后再传给Freemarker,前端直接输出字符串即可:
// 后端示例:将数值转为带指定格式的字符串 String numStr1 = String.format("%.1f", 1.0); // 得到"1.0" String numStr3 = String.format("%.3f", 4.0); // 得到"4.000"
Freemarker中直接输出:
${numStr1} <!-- 输出1.0 --> ${numStr3} <!-- 输出4.000 -->
注意事项
- 不要直接用
double类型处理需要保留末尾零的场景,因为它无法区分1和1.0; - 如果必须在Freemarker中处理且已知小数位数固定,可以用
?string["0.0"]这类格式化指令,但你提到末尾零数量未知,所以这种方法不适用。
内容的提问来源于stack exchange,提问作者Hemanth
相关产品推荐
相关产品推荐

