我使用toRadians()
来转换值并找到这样的三角函数
dataMain = Math.cos(Math.toRadians(dataSub);
但我有一个问题,例如dataSub = 60
答案应为0.5
但我的计划中的答案是0.50000000000001
甚至是dataSub = 30
dataMain = Math.sin(Math.toRadians(dataSub);
我的计划中的答案是0.49999999999994
我该如何解决这个问题?
答案 0 :(得分:5)
将角度从度数转换为弧度时,结果是一个通常不能完全表示为浮点数的数字。您只能使用大约16位数字。
因此,当你计算toRadians(60)
的余弦时,你实际上是在计算一个非常接近但不等于π/ 3的数字的余弦。
您希望如何解决此问题取决于您的应用程序。在绝大多数现实世界的应用程序中,像这样的微小不准确性确实没有什么区别。如果您想要很好地呈现结果,那么您可以简单地舍入到您想要的位数。
答案 1 :(得分:1)
答案 2 :(得分:0)
分数存储为浮点数,基本上是近似值;这会导致很小的不准确性,例如你所描述的那些。比我更聪明的人在sin, cos, tan and rounding error
报道了这一点最好的解决方法是将值四舍五入为可接受的位数,How to round a number to n decimal places in Java
涵盖了几种方法。答案 3 :(得分:0)
Jeffrey说的绝对正确,特别是在这种情况下。但是,由于以下问题,您可能会发现类似的结果:通常使用基数2在内部表示浮点数。这意味着您的数字被写为尾数* 2 ^(指数)。这实际上是将您的数字转换为基数2,这并不总是理想的。假设您想在内部表示0.2。 0.2的二进制表示不是有限的,实际上是0.00110011 ...(在基数10中1/3是0.3333 ...)。由于您只为尾数存储有限数量的数字,因此数字在存储时会被截断,然后当它被转换回十进制进行打印时,它将显示为0.19999 ...而不是0.2。例如,我在python中已经注意到了很多。您只需在交互式shell中输入0.2,它就会吐出接近0.2但略小或稍大的东西。