为什么tan 45
(0.7853981633974483 in 弧度) 给我0.9999
?以下代码有什么问题?
System.out.println(Math.tan(Math.toRadians(45.0)) );
我不认为这里有任何错字。
那么这里的解决方案是什么?
为什么tan 45
(0.7853981633974483 in 弧度) 给我0.9999
?以下代码有什么问题?
System.out.println(Math.tan(Math.toRadians(45.0)) );
我不认为这里有任何错字。
那么这里的解决方案是什么?
浮点计算经常会导致这样的不准确。问题是数字不能在固定位数内准确表示。
再举一个例子(十进制),我们都同意3 * (1/3) = 1
. 但是,如果您的计算器只有 4 位小数,1/3
则表示为0.3333
. 当它乘以 时3
,你会得到0.9999
not 1
。
作为进一步的信息,大多数系统上的浮点通常使用 IEEE754 标准表示。您可以搜索它,或参考维基百科页面了解更多详细信息。IEEE 浮点数
最接近double
的pi/4
是. _ 0x1.921fb54442d18p-1
这个 double 的切线,比你需要的多,是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,其余的是舍入误差。由于浮点计算的工作方式,浮点计算不太可能为您提供准确的结果。