9

为什么tan 45(0.7853981633974483 in 弧度) 给我0.9999?以下代码有什么问题?

System.out.println(Math.tan(Math.toRadians(45.0)) );

我不认为这里有任何错字。

那么这里的解决方案是什么?

4

4 回答 4

19

浮点计算经常会导致这样的不准确。问题是数字不能在固定位数内准确表示。

再举一个例子(十进制),我们都同意3 * (1/3) = 1. 但是,如果您的计算器只有 4 位小数,1/3则表示为0.3333. 当它乘以 时3,你会得到0.9999not 1

作为进一步的信息,大多数系统上的浮点通常使用 IEEE754 标准表示。您可以搜索它,或参考维基百科页面了解更多详细信息。IEEE 浮点数

于 2012-12-08T07:41:13.860 回答
10

最接近doublepi/4是. _ 0x1.921fb54442d18p-1这个 double 的切线,比你需要的多,是0x1.fffffffffffff72cece67p-1. 四舍五入到最接近的double结果正是 0x1.fffffffffffffp-1因为0x1.fffffffffffff72cece67p-1小于0x1.fffffffffffff8p-1

于 2012-12-08T15:42:49.897 回答
2

用这个

double radians = Math.toRadians(45.0);

System.out.format("The tangent of 45.0 degrees is %.4f%n", Math.tan(radians));
于 2012-12-08T07:41:00.100 回答
0

那可能是因为tan(45)是 1,其余的是舍入误差。由于浮点计算的工作方式,浮点计算不太可能为您提供准确的结果。

于 2012-12-08T07:41:12.003 回答