Browse Source

修改roundTo,详见代码注释

zhangyin 7 years ago
parent
commit
36dbe85324
1 changed files with 11 additions and 1 deletions
  1. 11 1
      public/web/scMathUtil.js

+ 11 - 1
public/web/scMathUtil.js

@@ -2,6 +2,9 @@
  * Created by jimiz on 2017/3/28.
  * Created by jimiz on 2017/3/28.
  * 经验证:10000次四舍五入,用num.toFixed为15毫秒,用roundTo为47毫秒,速度低一些,但可以接受
  * 经验证:10000次四舍五入,用num.toFixed为15毫秒,用roundTo为47毫秒,速度低一些,但可以接受
  * 另:经手工验证,用num.toString(2)将十进制浮点数转换为二进制浮点数时,最后一位有错误的情况出现,例子(10.0311)
  * 另:经手工验证,用num.toString(2)将十进制浮点数转换为二进制浮点数时,最后一位有错误的情况出现,例子(10.0311)
+ *
+ * zhangyin 2018-02-28
+ * 采用重复一次四舍五入解决浮点精度误差后,10000次roundTo的时间为94毫秒。
  */
  */
 
 
 let scMathUtil = {
 let scMathUtil = {
@@ -152,10 +155,17 @@ let scMathUtil = {
         };
         };
         return result;
         return result;
     },
     },
-    roundTo: function(num, digit){
+    reRoundTo: function(num, digit){
         let me = this;
         let me = this;
         return me.innerRoundTo(me.binToFloat(me.incMantissa(me.floatToBin(num))), digit);
         return me.innerRoundTo(me.binToFloat(me.incMantissa(me.floatToBin(num))), digit);
     },
     },
+    // zhangyin 2018-02-28
+    // 经过运算后的浮点数,误差可能更大,加尾数也不能消除。目前采用笨办法,将有效位数加一位再四舍五入一次,以消除浮点误差。
+    // 此办法效率较低,没有别的更好办法时暂时用着
+    roundTo: function(num, digit){
+        let me = this;
+        return me.reRoundTo(me.reRoundTo(num, digit - 1), digit);
+    },
     isNumber : function (obj) {
     isNumber : function (obj) {
         return obj === +obj;
         return obj === +obj;
     },
     },