服务器测评网
我们一直在努力

用java怎么出租车车费

在Java中实现出租车车费的计算系统,需要综合考虑多种因素,如起步价、里程费、等待费、夜间附加费以及不同时间段的价格调整等,下面将从系统设计、核心算法实现、代码结构优化以及扩展性考虑等方面,详细介绍如何构建一个完整的出租车车费计算程序。

用java怎么出租车车费

需求分析与系统设计

在开始编码之前,首先需要明确出租车车费的计算规则,以国内常见的出租车计价方式为例,通常包含以下要素:

  1. 起步价:如前3公里内10元;
  2. 里程费:超出起步里程后,每公里2元;
  3. 等待费:每分钟0.5元,或每5分钟按1公里计算;
  4. 夜间附加费:如23:00至次日5:00,车费加收20%;
  5. 燃油附加费:如每趟加收1元;
  6. 远程附加费:超过15公里后,每公里3元。

基于以上规则,系统设计应包含以下核心模块:

  • 输入模块:接收行驶里程、等待时间、上下车时间等参数;
  • 计价模块:根据不同规则分段计算费用;
  • 输出模块:展示明细费用和总费用;
  • 时间处理模块:判断是否为夜间时段并计算附加费。

核心算法实现

基础费用计算

基础费用包括起步价和里程费,需分段计算:

public double calculateBasicFare(double distance) {
    final double START_DISTANCE = 3.0; // 起步里程
    final double START_PRICE = 10.0;   // 起步价
    final double NORMAL_PRICE = 2.0;   // 普通里程单价
    final double LONG_DISTANCE = 15.0; // 远程里程阈值
    final double LONG_PRICE = 3.0;     // 远程里程单价
    double basicFare = 0.0;
    if (distance <= START_DISTANCE) {
        basicFare = START_PRICE;
    } else {
        basicFare = START_PRICE;
        double remainingDistance = distance - START_DISTANCE;
        if (remainingDistance <= LONG_DISTANCE - START_DISTANCE) {
            basicFare += remainingDistance * NORMAL_PRICE;
        } else {
            basicFare += (LONG_DISTANCE - START_DISTANCE) * NORMAL_PRICE;
            basicFare += (remainingDistance - (LONG_DISTANCE - START_DISTANCE)) * LONG_PRICE;
        }
    }
    return basicFare;
}

等待费计算

等待费可按时间或折算为里程计算,这里以时间为例:

public double calculateWaitingFare(long waitingMinutes) {
    final double WAITING_PRICE_PER_MINUTE = 0.5;
    return waitingMinutes * WAITING_PRICE_PER_MINUTE;
}

夜间附加费计算

根据上下车时间判断是否为夜间时段:

用java怎么出租车车费

public boolean isNightTime(LocalDateTime startTime, LocalDateTime endTime) {
    final LocalTime NIGHT_START = LocalTime.of(23, 0);
    final LocalTime NIGHT_END = LocalTime.of(5, 0);
    boolean startIsNight = !startTime.toLocalTime().isBefore(NIGHT_START) || 
                          startTime.toLocalTime().isAfter(NIGHT_END);
    boolean endIsNight = !endTime.toLocalTime().isBefore(NIGHT_START) || 
                        endTime.toLocalTime().isAfter(NIGHT_END);
    return startIsNight || endIsNight;
}
public double calculateNightSurcharge(double totalFare, LocalDateTime startTime, LocalDateTime endTime) {
    final double NIGHT_SURCHARGE_RATE = 0.2;
    return isNightTime(startTime, endTime) ? totalFare * NIGHT_SURCHARGE_RATE : 0.0;
}

总费用汇总

将各项费用累加,并处理四舍五入(通常出租车计费到元,角四舍五入):

public double calculateTotalFare(double distance, long waitingMinutes, 
                               LocalDateTime startTime, LocalDateTime endTime) {
    double basicFare = calculateBasicFare(distance);
    double waitingFare = calculateWaitingFare(waitingMinutes);
    double fuelSurcharge = 1.0; // 燃油附加费固定
    double subtotal = basicFare + waitingFare + fuelSurcharge;
    double nightSurcharge = calculateNightSurcharge(subtotal, startTime, endTime);
    double totalFare = subtotal + nightSurcharge;
    return Math.round(totalFare * 10) / 10.0; // 保留一位小数,相当于角的四舍五入
}

代码结构优化

为提高代码的可读性和可维护性,可采用面向对象的设计模式:

定义计价规则类

public class FareRule {
    private double startDistance;
    private double startPrice;
    private double normalPrice;
    private double longDistanceThreshold;
    private double longPrice;
    private double waitingPricePerMinute;
    private double nightSurchargeRate;
    private double fuelSurcharge;
    // 构造方法、getter和setter省略
}

定义计价服务类

public class FareCalculator {
    private FareRule fareRule;
    public FareCalculator(FareRule fareRule) {
        this.fareRule = fareRule;
    }
    public double calculateTotalFare(TripInfo tripInfo) {
        // 调用各计价方法并汇总
    }
}
public class TripInfo {
    private double distance;
    private long waitingMinutes;
    private LocalDateTime startTime;
    private LocalDateTime endTime;
    // getter和setter省略
}

使用枚举管理时段

public enum TimePeriod {
    DAY("白天", 6, 22),
    NIGHT("夜间", 22, 6);
    private String description;
    private int startHour;
    private int endHour;
    // 构造方法和getter省略
}

扩展性与异常处理

参数校验

对输入参数进行合法性检查,如里程不能为负数,等待时间不能为负数等:

public void validateTripInfo(TripInfo tripInfo) {
    if (tripInfo.getDistance() < 0) {
        throw new IllegalArgumentException("行驶里程不能为负数");
    }
    if (tripInfo.getWaitingMinutes() < 0) {
        throw new IllegalArgumentException("等待时间不能为负数");
    }
    if (tripInfo.getStartTime().isAfter(tripInfo.getEndTime())) {
        throw new IllegalArgumentException("结束时间不能早于开始时间");
    }
}

动态调整计价规则

通过配置文件或数据库管理计价规则,便于后续调整:

public class FareRuleConfig {
    public static FareRule loadDefaultRule() {
        FareRule rule = new FareRule();
        rule.setStartDistance(3.0);
        rule.setStartPrice(10.0);
        // 设置其他规则...
        return rule;
    }
}

日志记录

记录计价过程,便于排查问题:

用java怎么出租车车费

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class FareCalculator {
    private static final Logger logger = LoggerFactory.getLogger(FareCalculator.class);
    public double calculateTotalFare(TripInfo tripInfo) {
        logger.info("开始计算车费,行程信息:{}", tripInfo);
        // 计费逻辑...
        logger.info("车费计算完成,总费用:{}", totalFare);
        return totalFare;
    }
}

测试与验证

为确保计费逻辑的正确性,需编写单元测试覆盖各种场景:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class FareCalculatorTest {
    @Test
    public void testDaytimeShortTrip() {
        FareRule rule = FareRuleConfig.loadDefaultRule();
        FareCalculator calculator = new FareCalculator(rule);
        TripInfo trip = new TripInfo(2.0, 0, LocalDateTime.of(2023, 1, 1, 10, 0), 
                                   LocalDateTime.of(2023, 1, 1, 10, 10));
        double fare = calculator.calculateTotalFare(trip);
        assertEquals(10.0, fare);
    }
    @Test
    public void testNightLongTrip() {
        // 测试夜间远程行程
    }
    @Test
    public void testInvalidInput() {
        // 测试非法输入
    }
}

通过以上步骤,可以构建一个健壮、可扩展的Java出租车车费计算系统,关键点包括:

  1. 清晰的需求分析:明确计价规则和边界条件;
  2. 模块化设计:将不同功能拆分为独立模块,降低耦合度;
  3. 面向对象编程:使用类和枚举管理数据和逻辑;
  4. 完善的异常处理:确保程序对非法输入的容错能力;
  5. 可配置性:通过外部配置管理计价规则,便于维护;
  6. 充分的测试:保证核心逻辑的正确性。

实际应用中,还可根据城市差异扩展更多计价规则,如高峰时段附加费、高速费等,并通过RESTful API或图形界面与用户交互,形成完整的出租车计价解决方案。

赞(0)
未经允许不得转载:好主机测评网 » 用java怎么出租车车费