js精确四则运算

由于js的乘除和加减运算有时会出现丢失精度的问题,同时,两个非数字相加也会出现类型转换的问题,所以特地写了一个四则运算的js不丢失精度版来处理js中的四则运算。

    /**
     * 精确加法
     *
     * @param {String | Number} arg1
     * @param {String | Number} arg2
     *
     * @returns {number} arg1 + arg2
     */
    exports.add = function add(arg1, arg2) {
        // 数字化
        var num1 = parseFloat(arg1);
        var num2 = parseFloat(arg2);

        var r1, r2, m;
        try {
            r1 = num1.toString().split(".")[1].length;
        } catch (e) {
            r1 = 0;
        }

        try {
            r2 = num2.toString().split(".")[1].length;
        } catch (e) {
            r2 = 0;
        }

        m = Math.pow(10, Math.max(r1, r2));

        return (num1 * m + num2 * m) / m;
    };

    /**
     * 精确减法
     *
     * @param {Number | String} arg1
     * @param {Number | String} arg2
     *
     * @returns {number} arg1 - arg2
     */
    exports.sub = function sub(arg1, arg2) {
        // 数字化
        var num1 = parseFloat(arg1);
        var num2 = parseFloat(arg2);

        var r1, r2, m, n;
        try {
            r1 = num1.toString().split(".")[1].length;
        } catch (e) {
            r1 = 0;
        }
        try {
            r2 = num2.toString().split(".")[1].length;
        } catch (e) {
            r2 = 0;
        }

        m = Math.pow(10, Math.max(r1, r2));

        return ((num1 * m - num2 * m) / m);
    };

    /**
     * 精确乘法
     *
     * @param {Number | String} arg1
     * @param {Number | String} arg2
     * @returns {number} arg1 * arg2s
     */
    exports.mul = function mul(arg1, arg2) {
        // 数字化
        var num1 = parseFloat(arg1);
        var num2 = parseFloat(arg2);

        var m = 0, s1 = num1.toString(), s2 = num2.toString();
        try {
            m += s1.split(".")[1].length;
        } catch (e) {
        }
        try {
            m += s2.split(".")[1].length;
        } catch (e) {
        }
        return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
    };

    /**
     * 精确除法
     *
     * @param {Number | String} arg1
     * @param {Number | String} arg2
     * @returns {number}
     */
    exports.div = function div(arg1, arg2) {
        // 数字化
        var num1 = parseFloat(arg1);
        var num2 = parseFloat(arg2);

        var t1 = 0, t2 = 0, r1, r2;

        try {
            t1 = num1.toString().split(".")[1].length;
        } catch (e) {
        }

        try {
            t2 = num2.toString().split(".")[1].length;
        } catch (e) {
        }

        r1 = Number(num1.toString().replace(".", ""));
        r2 = Number(num2.toString().replace(".", ""));
        return (r1 / r2) * Math.pow(10, t2 - t1);
    };

有需要的同学可以自取。

更多内容请查看zakwu的小站

时间: 2024-10-29 18:58:20

js精确四则运算的相关文章

JS 精确乘除法

javascript(js)的小数点乘法除法问题 分类: Javascript2012-07-24 10:09 2851人阅读 评论(0) 收藏 举报 javascriptfunctionmath测试div 一.用js计算 12.32 * 7  结果是多少? 答案:86.24000000000001 为什么会出现这种问题?怎么解决? js在处理小数的乘除法的时候有一个bug,解决的方法可以是:将小数变为整数来处理. 以上的计算可以改为: 12.32 * 100 * 7 /100 得出的结果是:8

【转】Java精确四则运算

/** * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 确的浮点数运算,包括加减乘除和四舍五入. */ public class Arith { // 默认除法运算精度 private static final int DEF_DIV_SCALE = 10; // 这个类不能实例化 private Arith() { } /** * 提供精确的加法运算. * * @param v1 * 被加数 * @param v2 * 加数 * @return 两个参数的和 */ p

JS精确到小数点两位

1.会四色五入 var num =2.446242342; num = num.toFixed(2); // 输出结果为 2.452.正则Number(15.7784514000.toString().match(/^\d+(?:\.\d{0,2})?/)) 3.最笨function get() {     var s = 22.127456 + "";     var str = s.substring(0,s.indexOf(".") + 3);     ale

js精确判断数据类型为何用Object.prototype.toString.call()而不是Object.prototype.toString()

有何区别,为何一定要通过call. 我们知道call是用来改变函数作用域的,Object.prototype.toString.call在这儿也是用来改变作用域的. Object.prototype.toString()  在toString方法被调用时,会执行下面的操作步骤(参考): 1. 获取this对象的[[Class]]属性的值. 2. 计算出三个字符串"[object ", 第一步的操作结果Result(1), 以及 "]"连接后的新字符串. 3. 返回第

js精确计算

//加 Number.prototype.add = function(arg) {     var r1, r2, m;     try{r1 = this.toString().split(".")[1].length;}catch(e){r1 = 0;}     try{r2 = arg.toString().split(".")[1].length;}catch(e){r2 = 0;}     m = Math.pow(10, Math.max(r1, r2

js精确加减乘除

//加法函数function accAdd(arg1, arg2) { var r1, r2, m; try { r1 = arg1.toString().split(".")[1].length; } catch (e) { r1 = 0; } try { r2 = arg2.toString().split(".")[1].length; } catch (e) { r2 = 0; } m = Math.pow(10, Math.max(r1, r2)); re

js精确运算

var CMX = CMX || {}; /** ** 加 **/ CMX.add = function (arg1, arg2) { var r1, r2, m, c; try { r1 = arg1.toString().split(".")[1].length; } catch (e) { r1 = 0; } try { r2 = arg2.toString().split(".")[1].length; } catch (e) { r2 = 0; } c =

《javascript语言精粹》读书笔记五

第十章 优美的特性 在本章开头 老道写到:"我想避开不谈浏览器和其他适合javascript的地方."我想要强调其更有分量的内容,以显示它是值得尊敬的语言. 我也这么认为,虽然我了解的语言种类不多,但是js强大的表现力还是使我深深的爱上了它. 以下是老道认为js种最精粹的部分: 函数是顶级对象 函数是有词法作用域的闭包. 基于原型继承的动态对象 对象是无类别的.我们可以通过普通的属性赋值给任何对象增加一个新成员属性,一个对象可以从另一个对象继承成员属性. 对象字面量和数组字面量 这对创

JS浮点计算精度问题分析与解决

问题描述 在JS计算四则运算时会遇到精度丢失的问题,会引起诸多问题,看看以下例子: 例如:在chrome控制台输入 0.1 + 0.7 输出结果是 0.7999999999999999 例如:0.1+0.2 输出结果:0.30000000000000004 例如:0.1277*1000000000000 输出结果:127700000000.00002 问题代码 bMsg.expectRate的值为0.1277 bMsg.expectRate * 1000000000000 / 100000000