为什么我的代码要比数学输出多一个呢?

vmpqdwk3  于 2021-06-27  发布在  Java
关注(0)|答案(4)|浏览(392)

好吧,我在写一个贷款计算器,在六个月的时间里,从之前的贷款中减去剩余贷款的10%。问题并不难,我写的代码似乎。。。嗯。。。弱智。

import java.util.Scanner;

public class Program
{
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int amount = scanner.nextInt();

        int payment;

        for (int month = 0; month < 6; month++)
        {
            payment = amount / 10;

            amount -= payment;
        }

        System.out.println(amount);

    }
}

代码有点工作,但我做了数学和数量的输出正好是1比它应该。有什么我还没学会的java规则吗?

jtoj6r0c

jtoj6r0c1#

一个好问题的一个特点是包括你的输入和输出。在您的例子中,每一行输入都会产生一行输出。你应该把问题放在一个三列的表格里。第一列应该是输入整数,第二列应该是预期的输出值(您的定义),第三列应该是代码为该输入生成的内容。一旦达到生成这个表的程度,就可以构造测试了。
就您的代码而言,您可以用这样的东西来测试它,而不必学习任何关于junit的知识。下面的脚本非常简单,使用了您应该学习的工具。好吧,也就是说,如果你打算在以后的职业生涯中使用真正的操作系统。您可以使用这些工具来测试许多代码,而不考虑其语言。
以下是您的特定程序的测试shell脚本:

javac Program.java
if [ $? -ne 0 ]; then
   exit 1;
fi

while read line; do
    echo $line > tmp
    java Program < tmp
done < test.dat > test.out

diff test.out test.spec

以下是一种执行方法:

$ sh test.sh

下面是代码通过运行脚本生成的内容:

$ cat test.out
54
533
5315
53145
268
2658
26573
265721

如果所有测试都通过了,那么脚本将不产生任何输出。下面是该脚本使用的测试数据。

$ cat test.dat
100
1000
10000
100000
500
5000
50000
500000

下面是这些数据的输出规范,因为您说过您的代码生成的输出正好比您期望的多出一个。

cat test.spec
53
532
5314
53144
267
2657
26572
265720

这是脚本生成的,因为代码不符合您的规范:

$ sh test.sh
1,8c1,8
< 54
< 533
< 5315
< 53145
< 268
< 2658
< 26573
< 265721
---
> 53
> 532
> 5314
> 53144
> 267
> 2657
> 26572
> 265720

如果你改变了 intdouble 在程序中的两个地方,脚本将生成以下内容:

$ sh test.sh
1,8c1,8
< 53.1441
< 531.441
< 5314.41
< 53144.1
< 265.7205
< 2657.205
< 26572.05
< 265720.5
---
> 53
> 532
> 5314
> 53144
> 267
> 2657
> 26572
> 265720

如果你想的话 floor 输出值,然后您可以使用 String.format 也许它会符合规范,但在这种情况下不会,因为我盲目地遵循你的定义(比期望的多1)。但是如果你接受测试驱动的开发,你会走得更远。

omhiaaxx

omhiaaxx2#

使用double而不是int,并且始终使用2个小数点,因为这是货币

public class Program {
  public static void main(String[] args) {
     Scanner scanner = new Scanner(System.in);
     double  amount = scanner.nextDouble();
     double payment;

     for (int month = 0; month < 6; month++) {
            payment = amount / 10;
            BigDecimal bd = new BigDecimal(payment).setScale(2, RoundingMode.HALF_UP);
            amount -= bd.doubleValue();
     }

     System.out.println(amount);
}

}

ccgok5k5

ccgok5k53#

处理整数时,可能会因为“.”后面的部分丢失而发生这种情况。让我们举一个你的问题的例子:假设你有100美元,那么付款是:
100 / 10 = 10
90 / 10 = 9
81 / 10 = 8
73 / 10 = 7
66 / 10 = 6
60/10=6-(这是您期望数字为5的地方,但不是因为您在以前的所有计算中丢失了小数部分)
产量:54
我个人认为这种计算应该用double而不是integer

qf9go6mv

qf9go6mv4#

解决方案

下面的代码将给您四舍五入两位小数的结果。
正如前面提到的注解,当你对一个整数进行76/10运算时,结果将是7,因此小数部分将丢失。
所以在下面的解决方案中,我使用了double而不是integer,我将结果四舍五入到两个小数位上,正如您对currency的期望。

import java.util.Scanner;

public class Programm
{
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        double amount = scanner.nextDouble();

        double payment;
        try {
        for (int month = 0; month < 6; month++)
        {

            payment = amount / 10;

            amount -= payment;
            amount = Math.round(100.0 * amount) / 100.0;
            }
        }catch(Exception e) {
            System.out.println("Zero Divivided");
        }

        System.out.println(amount);

    }
}

对于100的输入,代码产生结果53.15

相关问题