Java本身的数据处理不是很好,有精度丢失的问题。想办法不用除法吧,或是用BigDecimal这个类。

解决方案 »

  1.   

    对,用BigDeciaml
    BigDecimal step = new BigDecimal("0.05");
    BigDecimal t = new BigDecimal("0");
    System.out.println(step.doubleValue());
    for ( int i = 0; i <= 100000; i++){
    t = t.add(step);
    //if ( i % 10000 == 0)
    System.out.println(i + ": " + t.doubleValue());
    }
      

  2.   

    算出来的step已经是小数后面18位了,应该是够了吧。但累加时误差就出现了
      

  3.   

    java的误差是有的,但也不能排除用法的问题,要不你把有关的代码贴出来看看。
      

  4.   

    .............step=T / ( 4*A/0.05 );...................public void run() {
        try {
            Thread me = Thread.currentThread();
            while((runner == me) && demo) {
                analyseValue();
                computeCurve();
                pRight.repaint();  // 绘制曲线
                repaint();         // 绘制弹簧系统
                runner.sleep(100);
            }
            runner = null;
        }
        catch(InterruptedException ex) {
            System.out.println("中断");
        }
    }private void computeCurve() {
        double tmp = 6;
        total += step;
        if(total >= tmp) {
            pRight.setXEnd(tmp);
            ..........
            overRangeX = true;// 超出屏幕,x轴从0-6,超出后total还在增加,只是还是重绘0-6的曲线
            .........         // 当坐标移动时,调用新的total
        }
        else {
            pRight.setXEnd(total);  // 设置曲线的动点,每次重绘都重0-total
            .............           // 
        }
        ...............
    }
    其实代码是很简单的,就是把total送出,绘制正弦曲线,当时间长了线程暂停时(用按钮控制线程暂停),现出小球的位置,和算出了的曲线有偏差。h=Asin(ω * total + φ)。就象手表,走的时间长了就能看出和标准时间的偏差了。
      

  5.   

    误差出现在各种类型直接的转换,或者是使用除运算符号,失去了所要的精度,你可以在关键位置使用int型!来去掉精度的累积,使其在传递的时候,不会出现精度的误差。