tan 45给了我0.9999
为什么tan 45
(弧度为0.7853981633974483)给我0.9999
? 以下代码有什么问题?
System.out.println(Math.tan(Math.toRadians(45.0)) );
我不认为这里有任何错字。
那么这里的解决方案是什么?
浮点计算通常会导致这种不准确。 问题是数字不能在固定的位数内准确表示。
为了给你另一个例子(十进制),我们都同意3 * (1/3) = 1
。 但是,如果您的计算器只有4位小数,则1/3
将表示为0.3333
。 当它乘以3
,你会得到0.9999
而不是1
。
作为进一步的信息,大多数系统上的浮点通常使用IEEE754标准来表示。 您可以搜索它,或参考Wikipedia页面以获取更多详细信息。 IEEE浮点
与pi/4
最接近的double
正好是 0x1.921fb54442d18p-1
。 这个双0x1.fffffffffffff72cece67p-1
的正切值比你需要的更多,是0x1.fffffffffffff72cece67p-1
。 舍入到最接近的double
会给出正确的 0x1.fffffffffffffp-1
因为0x1.fffffffffffff72cece67p-1
小于0x1.fffffffffffff8p-1
。
用这个
double radians = Math.toRadians(45.0); System.out.format("The tangent of 45.0 degrees is %.4f%n", Math.tan(radians));
这可能是因为tan(45)
为1,其余是舍入误差。 由于浮点计算的工作原理,浮点计算极不可能为您提供准确的结果。