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

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

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

  1. import java.util.Scanner;
  2. public class Program
  3. {
  4. public static void main(String[] args) {
  5. Scanner scanner = new Scanner(System.in);
  6. int amount = scanner.nextInt();
  7. int payment;
  8. for (int month = 0; month < 6; month++)
  9. {
  10. payment = amount / 10;
  11. amount -= payment;
  12. }
  13. System.out.println(amount);
  14. }
  15. }

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

jtoj6r0c

jtoj6r0c1#

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

  1. javac Program.java
  2. if [ $? -ne 0 ]; then
  3. exit 1;
  4. fi
  5. while read line; do
  6. echo $line > tmp
  7. java Program < tmp
  8. done < test.dat > test.out
  9. diff test.out test.spec

以下是一种执行方法:

  1. $ sh test.sh

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

  1. $ cat test.out
  2. 54
  3. 533
  4. 5315
  5. 53145
  6. 268
  7. 2658
  8. 26573
  9. 265721

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

  1. $ cat test.dat
  2. 100
  3. 1000
  4. 10000
  5. 100000
  6. 500
  7. 5000
  8. 50000
  9. 500000

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

  1. cat test.spec
  2. 53
  3. 532
  4. 5314
  5. 53144
  6. 267
  7. 2657
  8. 26572
  9. 265720

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

  1. $ sh test.sh
  2. 1,8c1,8
  3. < 54
  4. < 533
  5. < 5315
  6. < 53145
  7. < 268
  8. < 2658
  9. < 26573
  10. < 265721
  11. ---
  12. > 53
  13. > 532
  14. > 5314
  15. > 53144
  16. > 267
  17. > 2657
  18. > 26572
  19. > 265720

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

  1. $ sh test.sh
  2. 1,8c1,8
  3. < 53.1441
  4. < 531.441
  5. < 5314.41
  6. < 53144.1
  7. < 265.7205
  8. < 2657.205
  9. < 26572.05
  10. < 265720.5
  11. ---
  12. > 53
  13. > 532
  14. > 5314
  15. > 53144
  16. > 267
  17. > 2657
  18. > 26572
  19. > 265720

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

展开查看全部
omhiaaxx

omhiaaxx2#

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

  1. public class Program {
  2. public static void main(String[] args) {
  3. Scanner scanner = new Scanner(System.in);
  4. double amount = scanner.nextDouble();
  5. double payment;
  6. for (int month = 0; month < 6; month++) {
  7. payment = amount / 10;
  8. BigDecimal bd = new BigDecimal(payment).setScale(2, RoundingMode.HALF_UP);
  9. amount -= bd.doubleValue();
  10. }
  11. System.out.println(amount);
  12. }

}

展开查看全部
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的期望。

  1. import java.util.Scanner;
  2. public class Programm
  3. {
  4. public static void main(String[] args) {
  5. Scanner scanner = new Scanner(System.in);
  6. double amount = scanner.nextDouble();
  7. double payment;
  8. try {
  9. for (int month = 0; month < 6; month++)
  10. {
  11. payment = amount / 10;
  12. amount -= payment;
  13. amount = Math.round(100.0 * amount) / 100.0;
  14. }
  15. }catch(Exception e) {
  16. System.out.println("Zero Divivided");
  17. }
  18. System.out.println(amount);
  19. }
  20. }

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

展开查看全部

相关问题