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,其余是舍入误差。 由于浮点计算的工作原理,浮点计算极不可能为您提供准确的结果。