如何解决为什么我的代码输出比数学多一个?
好的,所以我正在编写一个贷款计算器,其中 10% 的贷款余额在六个月的过程中从之前的金额中减去。问题不难,就是我写的代码好像……呃……智障。
**SequelizeHostNotFoundError: getaddrinfo ENOTFOUND my_postgres**
代码可以正常工作,但我进行了数学计算,结果数量的输出正好比应有的多 1。是不是有什么我还没有学过的 Java 规则之类的?
解决方法
当你处理整数时,它可能会发生,因为'.'之后的部分丢失了。让我们举一个例子来说明你的问题: 假设您的金额为 100,因此付款为:
100 / 10 = 10
90 / 10 = 9
81 / 10 = 8
73 / 10 = 7
66 / 10 = 6
60 / 10 = 6 - (这是您期望数字为 5 的地方,但这不是因为您在之前的所有计算中都丢失了小数部分)
输出:54
我个人认为对于这样的计算你应该使用 double 而不是 integer
,解决方案
以下代码将为您提供保留两位小数的结果。
正如在评论中已经提到的,当你对一个整数做 76 / 10 时,结果将是 7,所以小数部分将丢失。
因此,在下面的解决方案中,我使用 double 而不是 integer,并将结果四舍五入到两位小数,正如您对货币所期望的那样。
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
,使用 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);
}
}
,一个好问题的标志之一是包括您的输入和输出。在您的情况下,每一行输入都会产生一行输出。你应该在你的问题中放入一个 3 列的表格。第一列应该是输入整数,第二列应该是预期的输出值(您的定义),第三列应该是代码为该输入生成的值。一旦达到可以生成此表的程度,就可以构建测试。
就您的代码而言,您可以使用类似的东西对其进行测试,而无需了解任何有关 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
如果您在程序中的两个地方将 int
更改为 double
,那么脚本生成的结果如下:
$ sh test.sh
1,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 个)。但是,如果您接受测试驱动开发,您将走得更远。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。