java - 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);
解决方案
推荐阅读
- anylogic - AnyLogic:如何在任何逻辑的延迟块中引用代理
- c++ - C++/Flatbuffers - 验证不是 root_type 的表
- variables - 使用 jekyll 和 github 页面构建静态站点时可用的变量
- java - Spring 数据 JDBC 迁移到 2.1 - IdGeneration 没有这种方法
- c - 无法用 C 在 Mac 上创建文件?
- flutter - Flutter Interactive Viewer 显示图像的缩小版本
- python - 将带有 yield(string) 的 python 函数翻译成 C++
- cakephp - cakephp 3中的路线和菜单链接问题
- java - 如何动态加载 CDI 事件观察者?
- java - 如何在按钮Android Studio中保存触摸次数的值