我想使用JAVA求正弦值,发现在调试的时候求PI的整数倍的正弦值的结果不是预期中的。(JDK版本1.5.0_15)
    代码如下:
    import java.lang.*;public class TestAngle
{
    public static void main(String[] arguments)
    {
        if(arguments.length > 0)
        {
            double a = Double.parseDouble(arguments[0]);
            double b = Math.sin(a * Math.PI);
            System.out.println(" " + a + " sin value is " + b);
        }
        else
        {
            System.out.println("please input value!");
        }
   }
}
    我在命令行中输入参数0或者0.5等数字的时候,显示的结果正确,但是输入1的时候计算结果是1.2246467991473532E-16,数学中PI的正弦值应该是0,为什么出现这样的结果?
            

解决方案 »

  1.   

    1.2246467991473532E-16 和 0
    有区别吗???已经非常接近了造成这个的原因是,Math.sin中应该使用了 double 类型
    而 double 是一个不精确的类型,在运算时很有可能出现近似值至于为什么出现近似值,以前听过解释,但现在忘了
      

  2.   

    造成这样的结果原因有两个:1,Math.PI 并不是一个非常精确的 pi 值,而是一个双精度浮点类型的值,与数学上的 pi
         还是差那么一丁点的;2,Math.sin 的运算方式,这个方法采用第三方类库实现的,是个本地方法,源代码看不到,
         估计是根据迭代法计算出来的,因为在迭代法中两次的计算结果小于一个最小值的话
         就作为结果返回了。由于 Math.PI、Math.sin 并非进行精确计算的,再加上数学意义上不精确的 double 类型,
    所以导致的结果是不精确的,这是必然现象。
      

  3.   

    如三楼所言计算机并不能精确地表示现实中的数据,对于double,float等的表示不是精确的,你的PI本来就不是精确值,而Math.sin的对double类型的运算也不是完全意义上的精确,所以才会出现这样的偏差但是,一般对于数学运算,都会有一个误差范围,只要在这个范围之内就算是计算正确,对于计算机的零值,好像是1.6r的负多少次方我忘了,只要误差小于这个数,就认为结果是0