java - 试图回答数学难题,但我的程序不会退出此循环

标签 java

前几天我遇到了一道数学题,并决定编写一些 Java 代码来找出答案。除了我的代码由于某些奇怪的原因无法工作。

问题是这样的:

Top Left + Top Right = 8, Top Left + Bottom Left = 13, Bottom Left - Bottom Right = 6, Top Right + Bottom Right = 8

这是我的代码:

public class Java {
    public static void main(String[] args) {
        double tLeft = 0;
        double tRight = 0;
        double bLeft = 0;
        double bRight = 0;

        while (bLeft - bRight != 6) {
            tLeft += 0.1;
            tRight = 8 - tLeft;
            bLeft = 13 - tLeft;
            bRight = 8 - tRight;
        }
        System.out.printf("Top Left = %f\nTop Right = %f\nBottom Left = %f\nBottom Right = %f\n\n", tLeft, tRight, bLeft, bRight);
    }
}

这将循环遍历左上角数字的所有可能变化,并根据该数字给出数字。是的,我知道这是非常笨拙和糟糕的代码,但我仍在学习!

这里的问题是我的 IDE (Eclipse) 将无限循环并且不会退出循环并打印答案。如果我将 tLeft 更改为声明为 3 而不是 0,我会得到答案,但如果我更进一步将其声明为 2.7 而不是 3,Eclipse 会决定再次无限循环。

我向大家提出的问题是 Eclipse 为何以及何时决定无限循环,以及如何阻止它以获得我想要的答案?

附注这道数学题的答案是:

左上角 = 3.5

右上角 = 4.5

左下= 9.5

右下= 3.5

提前谢谢您!

最佳答案

如果您检查 bLeft - bRight 的值,由于浮点错误,它会打印出 5.9999999,而实际上应该是 6。

避免这种情况的一种方法是检查差异是否小于某个 epsilon。由于每次迭代值都会变化 0.1,因此我选择了 0.05。那么while语句的守卫就变成了:

while (bLeft - bRight - 6 < 0.05) {

避免此问题的另一种方法是使用 BigDecimal ,它使用更精确的 float 学。

类似的答案(特别是 Eric Weilnau's answer 相关问题)建议 The need for BigDecimal来说明为什么 BigDecimal 在这里有帮助。

关于java - 试图回答数学难题,但我的程序不会退出此循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50780077/

相关文章:

java - Android Studio - 无法从预装的 sqlite 数据库检索数据

java - 创建自定义java注释以修改方法

java - 尝试将 BLOB 作为 InputStream 读取,但出现连接关闭错误。 Spring3 getJdbcTemplate() 方法

java - 我在java编程中遇到了问题。我收到错误 "column count doesn' t match the value count at row 1"

java - 允许用户在Java中搜索和删除ArrayList中的对象

java - Project Reactor如何并行调用两个或多个web服务或REST并加入答案

java - 多次写入输出流管道错误 - java

java - Ajax 调用后从 Java 下载 ZIP

java - 如何从java创建xml文件

java - 图像数据不足(生成 PDF 文件)