tan 45给了我0.9999

时间:2012-12-08 07:35:42

标签: java math floating-point precision trigonometry

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

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

我认为这里没有任何拼写错误。

那么解决方案是什么?

4 个答案:

答案 0 :(得分:16)

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

为了给你另一个例子(十进制),我们都同意3 * (1/3) = 1。但是,如果您的计算器只有4位小数,1/3将表示为0.3333。当它与3相乘时,您会0.9999而不是1

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

答案 1 :(得分:10)

最接近的doublepi/4 完全 0x1.921fb54442d18p-1。这个双精度的切线比你需要的更多,是0x1.fffffffffffff72cece67p-1。舍入到最近的double会为您提供完全 0x1.fffffffffffffp-1,因为0x1.fffffffffffff72cece67p-1小于0x1.fffffffffffff8p-1

答案 2 :(得分:2)

使用此

double radians = Math.toRadians(45.0);

System.out.format("The tangent of 45.0 degrees is %.4f%n", Math.tan(radians));

答案 3 :(得分:0)

这可能是因为tan(45)是1,其余的是舍入错误。由于浮点计算的工作原理,浮点计算极不可能为您提供准确的结果。