gpt4 book ai didi

java - 为什么 Java 会给我不寻常的 double 算术运算结果?

转载 作者:行者123 更新时间:2023-11-29 07:32:27 25 4
gpt4 key购买 nike

我正在为在火星上四处行驶以获取资源的虚拟漫游车编写一些智能。我有以下代码:

public Point getPointFromRoverOffset(double offsetX, double offsetY) {
double x = offsetX + currentLocation.x;
double y = offsetY + currentLocation.y;

if(x > getWorldWidth()) {
x = x - getWorldWidth();
}
else if (x < 0) {
x = getWorldWidth() + x;
}

if(y > getWorldHeight()) {
y = y - getWorldHeight();
}
else if(y < 0) {
y = getWorldHeight() + y;
}

getLog().info("Based on location " + currentLocation.toString());
getLog().info("Decided that offset (" + offsetX + "," + offsetY + ") = (" + x + "," + y + ")");
return new Point(x, y);
}

所有涉及的数字都是 double ,表示二维平面中的二维 vector 。

getWorldWidth() 和 getWorldHeight() 都返回 20.0

我得到以下奇怪的结果:

[INFO] 16:41 Versatile - Based on location (0.0,6.0)
[INFO] 16:41 Versatile - Decided that offset (0.0,-5.999999999999999) = (0.0,8.881784197001252E-16)

貌似输入的Y值-5.9(重复出现,双舍入错误),而当前Y位置0.6所以值应该是0.1。然而它的结果是 8.88(等)。

为什么?这是我不知道的 double 的一些奇怪行为吗?还是我遗漏了更明显的东西?

最佳答案

8.881784197001252E-16 是一个非常小的数字。它大约是 0.000000000000000888 或 8.88*10^-16。它是略有舍入误差的值与期望值之间的差值。

如果你需要精确的值,我建议要么

  • double 比赛
  • 在您的计算中使用允许的小误差,例如ERR = 1e-6
  • 使用整数(例如,将所有内容缩放 1000)
  • 使用 BigDecimal。

关于java - 为什么 Java 会给我不寻常的 double 算术运算结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40112952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com