为什么tan 45
(弧度为0.7853981633974483)给我0.9999
?以下代码有什么问题?
System.out.println(Math.tan(Math.toRadians(45.0)) );
我认为这里没有任何拼写错误。
那么解决方案是什么?
答案 0 :(得分:16)
浮点计算通常会导致这种不准确。问题是数字不能在固定的位数内准确表示。
为了给你另一个例子(十进制),我们都同意3 * (1/3) = 1
。但是,如果您的计算器只有4位小数,1/3
将表示为0.3333
。当它与3
相乘时,您会0.9999
而不是1
。
作为进一步的信息,大多数系统上的浮点通常使用IEEE754标准表示。您可以搜索它,或参考维基百科页面了解更多详情。 IEEE floating point
答案 1 :(得分:10)
最接近的double
到pi/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,其余的是舍入错误。由于浮点计算的工作原理,浮点计算极不可能为您提供准确的结果。