zoukankan      html  css  js  c++  java
  • JS中浮点数相加问题

    https://blog.csdn.net/u012937029/article/details/61191512 

    采用IEEE 754 Floating-point的浮点数编码方式来表示浮点数 
    按IEEE 754格式保存的浮点数精度相当于带有15、16或17位小数位数的十进制小数,由于存在二进制和十进制的转换问题,具体的位数会发生变化。要获得最高的转换精度,必须指定17位的小数——此时可以相信前15位的精度 
    运算原则 
    ■ 大多数Web页面不需要小数 避免使用小数,尽量设法使用整数。确保数组的索引都是整数。按分(而不是元)计算金额。百分比放大100倍计算以避免出现小数。尽可能不用除法(/)和模(%)运算,因为大多数情况下它们直接导致出现浮点数。如果必须使用除法,立即用Math.round方法回归整数运算。

    ■ 如果必须使用浮点数,则尽可能引入冗余小数位——即在程序要求的运算精度之外,再增加小数位 如果程序需要5位数字的小数精度,则在运算中至少保留6位的小数,8位更好。冗余位越多,累计误差的影响越小。

    ■ 避免在同一个表达式中使用相差太大或太小的数值 对两个非常接近的数值执行减法或比较操作很容易出错。将很小的数值和很大数值相加无异于浪费时间,小的数值很可能被当作0。不过,很小的数值乘以很大的数值一般不会出现问题,例如2 * 12345678会得到正确的结果24691356。但是,0.1 - 0.09的结果是0.010000000000000009。

    ■ 用isFinite()和isNaN()检查运算结果 通过表单提交任何数值运算结果之前,一定要先检查数据的合法性。

    ■ 慎用数值运算 程序涉及的数值运算越少,引入误差的可能就越小。视浮点数为贵客,不可任意驱使。

    运算 
    paeseFloat(string); 
    toFixed();

    result.toFixed(3)*1000/1000;//保留三位小数,并且去掉末尾的0,最后一位会进行四舍五入。

    //加法
    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))
    return (this * m + arg * m) / m
    }

    //减法
    Number.prototype.sub = function (arg) {
    return this.add(-arg);
    }

    //乘法
    Number.prototype.mul = function (arg) {
    var m = 0, s1 = this.toString(), s2 = arg.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)
    }

    //除法
    Number.prototype.div = function (arg) {
    var t1 = 0, t2 = 0, r1, r2;
    try {
    t1 = this.toString().split(".")[1].length
    } catch (e) { }
    try {
    t2 = arg.toString().split(".")[1].length
    } catch (e) { }
    with (Math) {
    r1 = Number(this.toString().replace(".", ""))
    r2 = Number(arg.toString().replace(".", ""))
    return (r1 / r2) * pow(10, t2 - t1);
    }
    }

  • 相关阅读:
    Android性能测试工具APT使用指南
    android.app.Activity阅读摘要,有时候会不会需要保持一些现场数据呢? 想让系统帮你退出到后台或者挂掉前做些前置保持工作吗,重点参考吧:
    OkHttp+Stetho+Chrome调试android网络部分
    HLG2179 组合(dfs水水更健康)
    HLG 1494网络 (求的割点数目)可做模板
    hdu2586&&poj1330 求点间最短距&&最近公共祖先(在线&&离线处理):::可做模板
    hdu 2586
    poj分类
    poj3748 位运算 bitset
    C++ bitset类的使用与简介
  • 原文地址:https://www.cnblogs.com/rojas/p/8943063.html
Copyright © 2011-2022 走看看