• 封装加减乘除函数 解决JS 浮点数计算 Bug


    计算机内部的信息都是由二进制方式表示的,即0和1组成的各种编码,但由于某些浮点数没办法用二进制准确的表示出来,也就带来了一系列精度问题。当然这也不是JS独有的问题。

    例如, 我们在用JS做浮点运算会遇到这样的bug : 

    0.1 + 0.2 = 0.30000000000000004

    7 * 0.8 = 5.6000000000000005

    解决方法 -> 将小数转成整数来运算,之后再转回小数。

     1 function add(a, b) {
     2     var x, y, z;
     3     try {
     4         x = a.toString().split(".")[1].length;
     5     } catch (f) {
     6         x = 0;
     7     }
     8     try {
     9         y = b.toString().split(".")[1].length;
    10     } catch (f) {
    11         y = 0;
    12     }
    13     return z = Math.pow(10, Math.max(x, y)), (mul(a, z) + mul(b, z)) / z;
    14 }
     1 function sub(a, b) {
     2     var x, y, z;
     3     try {
     4         x = a.toString().split(".")[1].length;
     5     } catch (f) {
     6         x = 0;
     7     }
     8     try {
     9         y = b.toString().split(".")[1].length;
    10     } catch (f) {
    11         y = 0;
    12     }
    13     return z = Math.pow(10, Math.max(x, y)), (mul(a, z) - mul(b, z)) / z;
    14 }
     1 function mul(a, b) {
     2     var c = 0,
     3         d = a.toString(),
     4         e = b.toString();
     5     try {
     6         c += d.split(".")[1].length;
     7     } catch (f) {}
     8     try {
     9         c += e.split(".")[1].length;
    10     } catch (f) {}
    11     return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c);
    12 }
     1 function div(a, b) {
     2     var c, d, e = 0,
     3         f = 0;
     4     try {
     5         e = a.toString().split(".")[1].length;
     6     } catch (g) {}
     7     try {
     8         f = b.toString().split(".")[1].length;
     9     } catch (g) {}
    10     return c = Number(a.toString().replace(".", "")), d = Number(b.toString().replace(".", "")), mul(c / d, Math.pow(10, f - e));
    11 }

    用上面的方法进行浮点类型的四则运算就可以放心的玩耍了

  • 相关阅读:
    [bbk4999] 第100集 第12章 数据移植 06
    [bbk4992] 第98集 第12章 数据移植 04
    [bbk0000] 第101集 第12章 数据移植 08 本章案例 > 使用ORACLE_DATAPUMP擎创建外部表
    PL/SQL
    [zz]Python:time.clock() vs. time.time()
    MVC简介
    ajax_get/post_两级联动
    Ajax
    JAVAUML
    类与接口的区别
  • 原文地址:https://www.cnblogs.com/spotman/p/10819239.html
Copyright © 2020-2023  润新知