import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.List; public class RangAxis { public static void main(String[] args) { // 刻度 BigDecimal scale = new BigDecimal("3"); // 最小值 BigDecimal minVal = new BigDecimal("-10"); // 最大值 BigDecimal maxVal = new BigDecimal("10"); List<BigDecimal> axisList = getRangeAllScale(minVal, maxVal, scale); System.out.println(axisList); } /** * 获取区间所有的刻度 * @param minVal 最小值 * @param maxVal 最大值 * @param scale 规模/刻度大小[正数] * @return 区间所有的刻度 */ public static List<BigDecimal> getRangeAllScale(BigDecimal minVal, BigDecimal maxVal, BigDecimal scale) { // 获取区间最小值 BigDecimal rangMinVal = getStartVal(minVal, scale); // 获取区间最大值 BigDecimal rangMaxVal = getEndVal(maxVal, scale); // 获取区间所有刻度 List<BigDecimal> axisList = new ArrayList<>(); while (rangMinVal.compareTo(rangMaxVal) <= 0) { axisList.add(rangMinVal); rangMinVal = rangMinVal.add(scale); } return axisList; } /** * 获取开始边界值 * @param minVal 最小值 * @param scale 规模/刻度大小[正数] * @return 开始边界 */ public static BigDecimal getStartVal(BigDecimal minVal, BigDecimal scale) { if (minVal == null || scale == null) { return minVal; } BigDecimal startVal; BigDecimal[] divideAndRemainder = minVal.divideAndRemainder(scale); if (divideAndRemainder[1].compareTo(BigDecimal.ZERO) == 0) { // 余数为0,直接返回最小值 return minVal; } if (minVal.compareTo(BigDecimal.ZERO) < 0) { startVal = minVal.subtract(scale.add(divideAndRemainder[1])); }else if(minVal.compareTo(BigDecimal.ZERO) > 0) { startVal = minVal.subtract(divideAndRemainder[1]); }else { startVal = new BigDecimal("0"); } // 四舍五入保留2位小数返回 return startVal.setScale(2, RoundingMode.HALF_UP); } /** * 获取结束边界值 * @param maxVal 最大值 * @param scale 规模/刻度大小[正数] * @return 结束边界 */ public static BigDecimal getEndVal(BigDecimal maxVal, BigDecimal scale) { if (maxVal == null || scale == null) { return maxVal; } BigDecimal endVal; BigDecimal[] divideAndRemainder = maxVal.divideAndRemainder(scale); if (divideAndRemainder[1].compareTo(BigDecimal.ZERO) == 0) { // 余数为0,直接返回最大值 return maxVal; } if (maxVal.compareTo(BigDecimal.ZERO) < 0) { endVal = maxVal.subtract(divideAndRemainder[1]); }else if(maxVal.compareTo(BigDecimal.ZERO) > 0) { endVal = maxVal.add(scale.subtract(divideAndRemainder[1])); }else { endVal = new BigDecimal("0"); } // 四舍五入保留2位小数返回 return endVal.setScale(2, RoundingMode.HALF_UP); } }
Java根据值和刻度大小获取上一个/下一个刻度
最新推荐文章于 2024-10-27 15:49:02 发布