给Number类型增加加法、减、乘、除函数,解决float相加结果精度错乱的问题

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <script type="text/javascript">
        //给Number类型增加   加法函数
        Number.prototype.add = function (arg) {
            var l1 = this.toString().indexOf(‘.‘) > 0 ? this.toString().split(".")[1].length : 0,
                l2 = arg.toString().indexOf(‘.‘) > 0 ? arg.toString().split(".")[1].length : 0,
                pw = Math.pow(10, Math.max(l1, l2));
            return (arg * pw + pw * this) / pw;
        };
        //给Number类型增加   减法函数
        Number.prototype.sub = function (arg) {
            var l1 = this.toString().indexOf(‘.‘) > 0 ? this.toString().split(".")[1].length : 0,
                l2 = arg.toString().indexOf(‘.‘) > 0 ? arg.toString().split(".")[1].length : 0,
                pw = Math.pow(10, Math.max(l1, l2)),
                //动态控制精度长度
                l = (l1 >= l2) ? l1 : l2;
            return ((this * pw - arg * pw) / pw).toFixed(l);
        }
        //给Number类型增加   乘法函数
        Number.prototype.mul = function (arg) {
            var pw = 0;
            pw += this.toString().indexOf(‘.‘) > 0 ? this.toString().split(".")[1].length : 0;
            pw += arg.toString().split(".")[1].length > 0 ? arg.toString().split(".")[1].length : 0;
            return Number(arg.toString().replace(".", "")) * Number(this.toString().replace(".", "")) / Math.pow(10, pw);
        }
        //给Number类型增加   除法函数
        Number.prototype.div = function (arg) {
            var l1 = this.toString().indexOf(‘.‘) > 0 ? this.toString().split(".")[1].length : 0,
            l2 = arg.toString().indexOf(‘.‘) > 0 ? arg.toString().split(".")[1].length : 0;
            with (Math) {
                r1 = Number(this.toString().replace(".", ""));
                r2 = Number(arg.toString().replace(".", ""));
                return (r1 / r2) * pow(10, l2 - l1);
            }
        }
        /*加法函数  调用实例*/
        var testadd = [1.123, 2.456, 3.456, 4, 5, 6, 7, 8, 9, 0];
        console.log(testadd[0].add(testadd[1]));    //3.579
        console.log(1.123 + 2.456);                 //错误对比:3.5789999999999997

        var count = 0;
        for (i in testadd)
            count = count.add(testadd[i]);
        console.log(count);                          //46.035
        console.log(‘加法函数  调用实例‘);

        /*减法函数  调用实例*/
        var testsub = [1.123, 2.456, 3.456, 4, 5, 6, 7, 8, 9, 0];
        console.log(testsub[1].sub(testsub[0]));    //1.333

        console.log(testsub[1].sub(testsub[2]));    //-1.000
        console.log(2.456 - 3.456);                 //小数对比:-1
        console.log(‘减法函数  调用实例‘);

        /*乘法函数  调用实例*/
        var testmul = [1.123, 2.456, 3.456, 4, 5, 6, 7, 8, 9, 0];
        console.log(testmul[1].mul(testmul[2]));    //8.487936
        console.log(2.456 * 3.456);                 //8.487936
        console.log(‘乘法函数  调用实例‘);

        //乘法函数  调用实例
        var testdiv = [1.123, 2.456, 3.456, 4, 5, 6, 7, 8, 9, 0];
        console.log(testdiv[1].div(testdiv[2]));    //0.7106481481481481
        console.log(2.456 / 3.456);                 //0.7106481481481481
        console.log(‘乘法函数  调用实例‘);
    </script>
</head>
<body>

</body>
</html>

  

时间: 2024-09-28 18:50:52

给Number类型增加加法、减、乘、除函数,解决float相加结果精度错乱的问题的相关文章

加法将 number 类型 转换成 string 类型

python也不是没有缺点在性能方面就Java.C++等老前辈还是没得比的,另外python和nodejs一样只能使用CPU单核,也是性能方面影响是因素之一. 发现只有A线程打印了"A",并没有发现B线程和C线程打印字符串:(.难道是A线程更改了Integer对象的值,而B线程和C线程并没有"看到"更新后的值?于是,在线程类的run方法的while循环中增加代码如下 在ABP里,一个应用服务应当实现IApplicationService接口,为每个应用服务创建一个接

html5 input[number]类型输入非数字字符val()为“”和解决方案

html5新增的number输入类型会在input框获得焦点的时候呼起数字键盘,增加了体验的效果.但是在一些安卓机器上,还是能够切换道字符输入,用户也会不小心输入"+""-"之类的非数字字符.测试了一下,number类型是会自动忽略字母字符和其他非数字字符的,除了"+""-""."这两个字符可以输入,因为这两个是正负数和小数点的符号. number类型还有一个很坑的点是,如果输入框中的内容不是纯数字(正数,

给类型增加方法

---恢复内容开始--- 在js开发过程中,有时候我们需要一些特定的方法,但是语言本身并没有提供.比如,去掉字符串两头的空格,给一个数字取整(这个有parseInt()和Math对象的方法).这时候我们怎样做才能让开发变得简单一些呢? 举个例子:给字符串去掉首位的空格.也就是让所有的字符串的原型拥有一个trim方法,可以这样做: String.prototype.trim=function(){ return this.replace(/^\s+|\s+$/g,''); } 这样我们在Strin

ORACLE 中NUMBER 类型 低精度转换成高精度

例如: 表User中有一个字段 salary  Number(10,3), 如果想把字段salary的类型提高精度到salary  Number(10,6),保留六位小数, 解决办法:1,ALTER TABEL USER MODIFY SALARY NUMBER(13,6); 解释:number类型刚开始是,长度10位,3位小数,如果想增加3位小数,对应的长度也必须增加,否则无法修改.所以NUMBER(13,6);这样就可以提高精度了, ORACLE 中NUMBER 类型 低精度转换成高精度

《JavaScript语言精粹》读书笔记——给类型增加方法一节的疑问

最近,在学习<JavaScript语言精粹>这本书,发现译者虽然有很好地翻译文章,却没有对文中有疑问的地方进行改正或加以注释.我接触JavaScript只有一年左右,可能无法很好的理解这门语言,而今天,读到第四章中4.7节——给类型增加方法时遇到了疑问之处: 文中给出了对类型增加方法的示例: Function.prototype.method = function (name, func) { this.prototype[name] = func; return this; }; 这里的示例

【Go语言】【4】GO语言类型和为类型增加方法

一.GO语言的类型 GO语言中内置了如下基础类型: 整型:byte(int8).int16.int.uint等 浮点型:float32.float64 复数类型:complex64.complex128 布尔类型:bool 字符类型:rune 字符串:string 错误类型:error 同时GO语言也支持下面的复合类型: 指针 数组 切片:slice 集合:map 通道:chan 结构体:struct 接口:interface 上看下看左看右看,怎么没有看到double类型呢?同时还有几个陌生的

ORACLE NUMBER类型Scale为0引发的问题

今天遇到了一个很有意思的NUMBER类型Scale引发的问题,我用一个简单的测试用例来展示一下这个案例.假如有个TEST的表,有个字段类型为NUMBER,我插入下面两条数据 CREATE TABLE TEST (      Category VARCHAR(12),      QTY  NUMBER )   INSERT INTO TEST SELECT 'M', 12 FROM DUAL UNION ALL SELECT 'C', 0.99999999999999999 FROM DUAL;

oracle中int类型和number类型区别

INT类型是NUMBER类型的子类型.下面简要说明:(1)NUMBER(P,S)该数据类型用于定义数字类型的数据,其中P表示数字的总位数(最大字节个数),而S则表示小数点后面的位数.假设定义SAL列为NUMBER(6,2)则整数最大位数为4位(6-2=4),而小数最大位数为2位.(2)INT类型当定义整数类型时,可以直接使用NUMBER的子类型INT,顾名思义:INT用于整型数据. oracle本来就没有int类型,为了与别的数据库兼容,新增了int类型作为number类型的子集.int类型只能

oracle中的number类型

number 数据类型 number (precision,scale) a)    precision表示数字中的有效位,如果没有指定precision的话,oracle将使用38作为精度: b)    如果scale大于零,表示数字精度到小数点右边的位数:scale默认设置为0:如果scale小于零,oracle将把该数字取舍到小数点左边的指定位数. c)    Precision 的取值范围是[1-38];scale的取值范围是[-84-127]. d)    Number整数部分允许的长