英尺英寸场景下Float数值比较结果不符合预期该如何处理
问题根因
你当前的用法属于逻辑错误:将英尺.英寸的特殊业务格式直接当成十进制浮点数解析,十进制规则下5.10等价于5.1,自然小于5.7,和浮点数精度无关,是存储/解析规则不符合业务场景导致的。
可行解决方案
方案1:统一转英寸存整数(最优)
把所有长度统一转换为以英寸为单位的整数存储,比较时直接对比整数即可,完全避免格式歧义:
// 工具方法:把英尺+英寸转成总英寸数 public static int toTotalInches(int feet, int inches) { return feet * 12 + inches; } // 比较逻辑 int f1Total = toTotalInches(5,7); // 计算结果为67 int f2Total = toTotalInches(5,10); // 计算结果为70 System.out.println(Integer.compare(f1Total, f2Total)); // 返回-1,符合5.10大于5.7的预期
方案2:拆分x.y格式字符串比较
如果业务必须保留x.y的字符串标识格式,就拆分字符串后分别对比英尺、英寸部分:
public static int compareFeetInch(String s1, String s2) { String[] arr1 = s1.split("\\."); String[] arr2 = s2.split("\\."); // 先比较英尺部分 int feet1 = Integer.parseInt(arr1[0]); int feet2 = Integer.parseInt(arr2[0]); if (feet1 != feet2) { return Integer.compare(feet1, feet2); } // 英尺相同再比较英寸部分 int inch1 = arr1.length > 1 ? Integer.parseInt(arr1[1]) : 0; int inch2 = arr2.length > 1 ? Integer.parseInt(arr2[1]) : 0; return Integer.compare(inch1, inch2); } // 调用示例 System.out.println(compareFeetInch("5.7", "5.10")); // 返回-1,符合预期
方案3:编码为整数存储
如果需要用单个数值存储同时保留x.y的展示逻辑,可以用英尺*100 + 英寸的规则编码为整数:
int code1 = 5 * 100 + 7; // 编码为507 int code2 = 5 * 100 + 10; // 编码为510 System.out.println(Integer.compare(code1, code2)); // 返回-1,符合预期 // 解码规则:英尺=code/100,英寸=code%100
内容的提问来源于stack exchange,提问作者Rpj
相关产品推荐
相关产品推荐

