如何解决java中的cos 90问题?

时间:2011-03-10 17:49:54

标签: java math cosine

我在使用Math.cos函数计算Java中的cosinus 90时遇到了一些问题:

public class calc{
      private double x;
      private double y;

      public calc(double x,double y){
                   this.x=x;
                   this.y=y;
      }

      public void print(double theta){
           x = x*Math.cos(theta);
           y = y*Math.sin(theta);
           System.out.println("cos 90 : "+x);
           System.out.println("sin 90 : "+y);
      }

      public static void main(String[]args){
           calc p = new calc(3,4);
           p.print(Math.toRadians(90));

      }

}

当我计算cos90或cos270时,它给出了absurb值。它应该是0.我用91或271测试,给出接近0是正确的。

如何使cos 90 = 0的输出?所以,它使输出x = 0和y = 4.

感谢您的建议

3 个答案:

答案 0 :(得分:9)

您获得的内容很可能是非常非常小的数字,它们以指数表示法显示。您获得它们的原因是因为pi / 2在IEEE 754表示法中不能完全表示,因此无法获得90/270度的精确余弦。

答案 1 :(得分:5)

只需运行您的来源,它就会返回:

cos 90 : 1.8369701987210297E-16
sin 90 : 4.0

这是绝对正确的。第一个值接近0.第二个值是预期的4个。

3 * cos(90°) = 3 * 0 = 0

在这里,您必须阅读Math.toRadians()文档,其中包含:

  

将以度为单位的角度转换为以弧度为单位测量的近似等效角度。从度到弧度的转换通常是不精确的。

更新:您可以使用Apache Commons存储库中的MathUtils.round()方法,并将输出四舍五入为8位小数,如下所示:

System.out.println("cos 90 : " + MathUtils.round(x, 8));

那会给你:

cos 90 : 0.0
sin 90 : 4.0

答案 2 :(得分:0)

试试这个:

public class calc
{
    private double x;
    private double y;
    public calc(double x,double y)
    {
        this.x=x;
        this.y=y;
    }
    public void print(double theta)
    {
        if( ((Math.toDegrees(theta) / 90) % 2) == 1)
        {
            x = x*0;
            y = y*Math.sin(theta);
        }
        else if( ((Math.toDegrees(theta) / 90) % 2) == 0)
        {
            x = x*Math.cos(theta);
            y = y*0; 
        }
        else
        {
           x = x*Math.cos(theta);
           y = y*Math.sin(theta); 
        }
        System.out.println("cos 90 : "+x);
        System.out.println("sin 90 : "+y);
    }
    public static void main(String[]args)
    {
        calc p = new calc(3,4);
        p.print(Math.toRadians(90));
    }
}