这两段代码:(1)var a = eval(form.a.value);
var b = eval(form.b.value);
var c = (Math.log(b))/(Math.log(a))
var d = Math.round(1000000*c)/1000000
form.z.value = d
(2)var a=10;
var b = eval(form.b.value);
var c = (Math.log(b))/(Math.log(a))
var d = Math.round(1000000*c)/1000000
form.z.value = d
第二段代码把底数固定为10,计算结果有时会不一样(两段代码都以10为底)。比如当b=25时两者结果一致为1.9794,当b=15(a=10)其结果(1)为1.176091(2)的结果是1。1760909999999999。

解决方案 »

  1.   

    浮点运算误差c还是d
    d应该不会吧 不是round了吗
      

  2.   

    b=15(a=10)测试了一下,1/2的c都等于
    1.1760912590556811IE/FF一样
      

  3.   

    两段代码除了第一行,其他一模一样,所以我怀疑是不是问题出在eval。
    任意底数代码(1)的计算结果比较准确,我希望的是底数为10代码(2)计算结果一致
      

  4.   

    LOG那东西涉及浮点运算误差。除非你在做什么重要项目需要来处理这个,否则不必在意这个。
      

  5.   

    我现在就是需要精确地计算10为底数的log
      

  6.   

    其结果(1)为1.176091(2)的结果是1。1760909999999999
    上面2个貌似只有很小很小的差别啊 可以忽视的差别而且你要精确的话a=eval(....) 这个不好
    你应该写 a=paseInt(....)
      

  7.   

    谢谢诸位了!
    我暂时想了个办法,就是round后,限定小数位数
    就像楼上说的,差别很小,其实就是小数点后9999太多一下6位一下那么多位的。
    所以我暂时设置把所有结果都限定小数位数。
    欢迎大家提供更好更彻底的方法...