2000 *  (19000/36882)   = 1030.31
2000 *  (8640/36882)    = 468.52
2000 *  (3510/36882)    = 190.34
2000 *  (585/36882)     = 31.72
2000 *  (4642/36882)    = 251.72
2000 *  (505/36882)     = 27.38为什么结果的和是  1999.99  而不是2000

解决方案 »

  1.   

    http://www.chinaret.com/user/topic_view.aspx?id=264ba1a2-eef9-4236-be15-960aeac00db6
      

  2.   

    http://www.cnblogs.com/bennman/archive/2011/06/09/2076568.html
      

  3.   

    sum.toFixed(2);
    js计算故有弊端
      

  4.   

    2000 * (19000/36882) 这些保留2位的话,精度已经不够了
    一起计算,或者保留足够精度 var a = 2000 * (19000/36882) + 2000 * (8640/36882) + 2000 * (3510/36882) + 2000 * (585/36882) + 2000 * (4642/36882) + 2000 * (505/36882)
    var a1 = 2000 * (19000/36882)
    var a2 = 2000 * (8640/36882)
    var a3 = 2000 * (3510/36882)
    var a4 = 2000 * (585/36882)
    var a5 = 2000 * (4642/36882)
    var a6 = 2000 * (505/36882)alert(Math.round(a * 1000) / 1000)
    alert(Math.round((a1+a2+a3+a4+a5+a6)*1000) /1000)
      

  5.   

    我的程序里是个循环就是  aaa += 2000 * (19000/36882)
         aaa += 2000 * (8640/36882)
         ......所有就 1999.99  了6楼的方法没法在程序里实现呀。。
      

  6.   

    这在算法里算是非常简单的一种情形了,用小学算法就解决了:
    这些算式,共同点都是一个变化的数*(2000/36882)
    所以在循环里只要让aaa+=变化的数,在循环结束后让a*(2000/36882)即可,至于要保留多少位,再自己处理。这样不仅可以消除中间的计算导致的精确度损失,也能提高计算效率。