tan 45给了我0.9999

sia*_*ooo 7 java math floating-point precision trigonometry

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

System.out.println(Math.tan(Math.toRadians(45.0)) );
Run Code Online (Sandbox Code Playgroud)

我不认为这里有任何错字.

那么这里的解决方案是什么?

Mas*_*Man 16

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

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

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

  • @ScottChamberlain:如果你以后用这个数字做任何计算,这不是一个好主意.舍入引入错误.您不希望再引入任何错误. (3认同)

tmy*_*ebu 10

最近doublepi/4正好 0x1.921fb54442d18p-1.这个双精度的切线比你需要的更多,是0x1.fffffffffffff72cece67p-1.四舍五入到最接近的位置double给出了完全 0x1.fffffffffffffp-1因为0x1.fffffffffffff72cece67p-1小于0x1.fffffffffffff8p-1.