开发Java密码生成器截取姓名半长时如何用ceil/floor处理奇数长度
Java密码生成器姓名截取逻辑实现方案
你当前写的代码使用Java正整数除法,默认就实现了*向下取整(floor)*的效果:
- 姓名长度为偶数时,比如长度4,4/2=2,正好取前半段2位
- 姓名长度为奇数时,比如长度5,5/2=2,自动舍去多出来的1位,取前2位
如果你需要实现*向上取整(ceil)*的效果,也就是奇数长度时多取1位(比如长度5取前3位),不需要额外调用Math包也能实现,用(长度 + 1) / 2的整数除法逻辑即可,比转double调用Math.ceil再强转的写法更简洁,也不会出现精度问题。
1. 奇数长度向下取整(默认需求,原代码可用)
如果你的需求就是奇数时取较短的前半段,现有代码不需要修改:
String password = firstName.substring(0, firstName.length() / 2) + lastName.substring(0, lastName.length() / 2);
测试示例:firstName为Zhang(长度5)取前2位Zh,lastName为San(长度3)取前1位S,拼接结果为ZhS
2. 奇数长度向上取整(ceil需求,调整计算逻辑)
如果需求是奇数时取较长的前半段,修改长度计算规则即可:
String password = firstName.substring(0, (firstName.length() + 1) / 2) + lastName.substring(0, (lastName.length() + 1) / 2);
测试示例:firstName为Zhang(长度5)取前3位Zha,lastName为San(长度3)取前2位Sa,拼接结果为ZhaSa
如果你非要用Math类的ceil方法实现,注意要除以2.0触发浮点运算,避免整数除法提前截断导致ceil失效:
String password = firstName.substring(0, (int) Math.ceil(firstName.length() / 2.0)) + lastName.substring(0, (int) Math.ceil(lastName.length() / 2.0));
注意:substring的结束索引不能超过字符串本身长度,上述两种计算逻辑的结果都不会超出字符串索引范围,可以放心使用。
内容的提问来源于stack exchange,提问作者G90
相关产品推荐
相关产品推荐

