0

我正在研究一个计算米单位的功能。米计算规则是:

  • 上午 1.6 公里的最低票价 - 12/-
  • 随后 1 公里 amt - 7/-
  • 午夜旅程加收 25% 的票价

我写的函数是:

public static void CalculateAutoFare(int kmIndex) {
    double fare = 12.00;
    double night = 15.00;
    double subseIncre = 1.50;
    double nightIncre = 0.25;
    int j=0;

    for (int i=1; i <= kmIndex; i++) {

        if (i == 3 || j == 4) {
            fare += 1.00f;
            j =0;
        } 
        else {
            fare += subseIncre;
            j++;
        }
        fare = Math.round(fare*2f)/2f;
        double extra = ((double) fare * nightIncre);
        night = fare + extra;
        night = Math.round(night*2f)/2f;

        System.out.println("I = " + i + " Fare = " + fare + " Night = " + night + " 25%Extra = " + extra);
    }

    System.out.println("Day = " + fare + " Night = " + night);
}   

kmIndex 是公里的索引。仪表读数为 1.00、1.10、1.20、1.30...1.90、2.00.... 因此 kmIndex 为 1.00 = 0、1.10 = 1、1.20 - 3 等等。

我根据代码得到的结果应该在下面提到:

在此处输入图像描述

我一直工作到 4 点,结果不正确的地方被宣布为 undet 应该与白天或晚上有关。

我为此做了很多工作,但无法达到预期的效果。如果我尝试纠正一件事情,那么其他事情就会出错或没有给出预期的结果。谁能帮我解决这个问题。几乎一整天都在试图解决这个问题。

4

2 回答 2

1

我分析了工作表,但没有找到一个公式可以给出那里显示的结果。似乎某些值有一些四舍五入的差异。我意识到只有 25 或 75 美分的值不同。例如,您计算了 18,5,它应该是 19(结果是 18,75,您向下舍入到 18,5,但应该向上舍入到 19)。因此,如果您没有用于创建表格的原始公式,我认为确保结果与工作表匹配的唯一方法是对其进行硬编码。这不是一个优雅的解决方案,但它保证了正确的结果。

于 2012-05-10T02:21:54.863 回答
0

代码中的小调整就可以了。您希望将 .75 舍入为 0.5,而不是乘以 2 乘以它的直接较小的浮点数。

{
            double fare = 12.00;
            double night = 15.00;
            double subseIncre = 1.50;
            double nightIncre = 0.25;
            int j=0;

            for (int i=1; i <= 22; i++) {

                if (i == 3 || j == 4) {
                    fare += 1.00f;
                    j =0;
                }
                else {
                    fare += subseIncre;
                    j++;
                }

                double extra = ((double) fare * nightIncre);
                night = fare + extra;
                ;

                System.out.println("I = " + i + " Fare = " + fare + " Night = " + night + " 25%Extra = " + extra);
            }
            System.out.println("actual Day = " + fare + " Night = " + night);

            fare = Math.round(fare*1.99f)/2f;
            night = Math.round(night*1.99f)/2f;
            System.out.println("rounded Day = " + fare + " Night = " + night);
    }
于 2012-05-08T17:12:26.223 回答