首页 > 解决方案 > Java 中 BigDecimal 数字的错误计算

问题描述

我正在为我的作业编写一种计算费马点的方法。但我不能通过测试。我已经尝试用简单的双精度进行所有计算。但它的工作方式相同。两次测试都失败了,我认为这与四舍五入无关。 在此处输入图像描述 在此处输入图像描述

问题在于“y”计数,最奇怪的是,在一个测试中它没有足够的数字,而在其他测试中似乎可以四舍五入。我究竟做错了什么?

    BigDecimal ax = new BigDecimal(points.get(0).getX());
    BigDecimal ay = new BigDecimal(points.get(0).getY());
    BigDecimal bx = new BigDecimal(points.get(1).getX());
    BigDecimal by = new BigDecimal(points.get(1).getY());
    BigDecimal cx = new BigDecimal(points.get(2).getX());
    BigDecimal cy = new BigDecimal(points.get(2).getY());


    BigDecimal firstX = cx.add(bx).add(cy.subtract(by).multiply(new BigDecimal(StrictMath.sqrt(3))))
            .divide(new BigDecimal(2.0d), 20, RoundingMode.HALF_UP);

    BigDecimal firstY = cy.add(by).add(bx.subtract(cx).multiply(new BigDecimal(StrictMath.sqrt(3))))
            .divide(new BigDecimal(2.0d), 20, RoundingMode.HALF_UP);


    BigDecimal secondX = ax.add(bx).add(ay.subtract(by).multiply(new BigDecimal(StrictMath.sqrt(3))))
            .divide(new BigDecimal(2.0d), 20, RoundingMode.HALF_UP);

    BigDecimal secondY = ay.add(by).add(bx.subtract(ax).multiply(new BigDecimal(StrictMath.sqrt(3))))
            .divide(new BigDecimal(2.0d), 20, RoundingMode.HALF_UP);


    BigDecimal a1 = cy.subtract(secondY);

    BigDecimal b1 = secondX.subtract(cx);

    BigDecimal a2 = ay.subtract(firstY);

    BigDecimal b2 = firstX.subtract(ax);


    BigDecimal d = a1.multiply(b2).subtract(a2.multiply(b1));


    BigDecimal c1 = secondY.multiply(cx).subtract(secondX.multiply(cy));

    BigDecimal c2 = firstY.multiply(ax).subtract(firstX.multiply(ay));


    BigDecimal resultX = b1.multiply(c2).subtract(b2.multiply(c1));
    resultX = resultX.divide(d, 16, RoundingMode.HALF_UP);

    BigDecimal resultY = a2.multiply(c1).subtract(a1.multiply(c2));
    resultY = resultY.divide(d, 17, RoundingMode.HALF_UP);

标签: java

解决方案


推荐阅读