【发布时间】:2016-09-21 23:30:19
【问题描述】:
我正在尝试计算带顶点的三角形的面积
{{0,1000000000},{1,0},{0,-1000000000}}
很容易看出这个三角形的面积应该是 1,000,000,000,但是当我尝试在 Java 中使用 Heron 公式或 Shoelace 公式计算面积时,我得到的面积为 0。
我很确定这是由于使用 doubles 时出现舍入错误,但我不知道如何继续。有什么指点吗?
程序:
private static double areaShoelace(int[][] v) {
return 0.5 * Math.abs(v[0][0]*v[1][1] + v[1][0]*v[2][1] + v[2][0]*v[0][1] +
v[1][0]*v[0][1] + v[2][0]*v[1][1] + v[0][0]*v[2][1]);
}
private static double areaHeron(double a, double b, double c) {
double p = (a + b + c) / 2.0d;
return Math.sqrt(p * (p - a) * (p - b) * (p - c));
}
private static double length(int[] a, int [] b) {
return Math.hypot(a[0] - b[0], a[1] - b[1]);
}
public static void main(String[] args) {
int[][] tri = new int[][]{{0,1000000000},{1,0},{0,-1000000000}};
System.out.println(areaShoelace(tri));
System.out.println(areaHeron(length(tri[0], tri[1]), length(tri[1],tri[2]), length(tri[0],tri[2])));
}
输出:
0.0
0.0
【问题讨论】:
-
你有没有看过这个问题:“Java中float和double的包含范围是多少?”它可能会对您的问题有所了解。 stackoverflow.com/questions/1650505/…
-
您的
areaShoelace()即使数字较小,仍然会给出 0。
标签: java floating-point precision area