`
rockyee
  • 浏览: 30733 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于JavaScript中计算精度丢失的问题(二)

阅读更多
3.3 加减乘除
对指定数字进行四舍五入可以通过floor/ceil或者正则表达式达到舍入的目的,那么四则运算是不是也可以升级成计算机能够精确识别的整数来计算,计算完毕再降级呢?这个答案是肯定的,我们先来看看加法:
Number.prototype.add = function(arg)
{
    var n, n1, n2, s, s1, s2, ps;

    s1 = this.toString();
    ps = s1.split('.');
    n1 = ps[1] ? ps[1].length : 0;

    s2 = arg.toString();
    ps = s2.split('.');
    n2 = ps[1] ? ps[1].length : 0;

    n = n1 > n2 ? n1 : n2;
    s = Number(s1.movePoint(n)) + Number(s2.movePoint(n));
    s = s.toString().movePoint(-n);
    return Number(s);
}

这时候再执行之前的加法
alert(Number(0.1).add(0.2));//弹出0.3
这时候就可以计算出精确的结果了。
类似可以写出减法:
Number.prototype.sub = function(arg)
{
    var n, n1, n2, s, s1, s2, ps;

    s1 = this.toString();
    ps = s1.split('.');
    n1 = ps[1] ? ps[1].length : 0;

    s2 = arg.toString();
    ps = s2.split('.');
    n2 = ps[1] ? ps[1].length : 0;

    n = n1 > n2 ? n1 : n2;
    s = Number(s1.movePoint(n)) - Number(s2.movePoint(n));
    s = s.toString().movePoint(-n);
    return Number(s);
}

类似可以写出乘法:
Number.prototype.mul = function(arg)
{
    var n, n1, n2, s, s1, s2, ps;

    s1 = this.toString();
    ps = s1.split('.');
    n1 = ps[1] ? ps[1].length : 0;

    s2 = arg.toString();
    ps = s2.split('.');
    n2 = ps[1] ? ps[1].length : 0;

    n = n1 + n2;
    s = Number(s1.replace('.', '')) * Number(s2.replace('.', ''));
    s = s.toString().movePoint(-n);
    return Number(s);
}

类似可以写出除法:
Number.prototype.div = function(arg)
{
    var n, n1, n2, s, s1, s2, ps;

    s1 = this.toString();
    ps = s1.split('.');
    n1 = ps[1] ? ps[1].length : 0;

    s2 = arg.toString();
    ps = s2.split('.');
    n2 = ps[1] ? ps[1].length : 0;

    n = n1 - n2;
    s = Number(s1.replace('.', '')) / Number(s2.replace('.', ''));
    s = s.toString().movePoint(-n);
    return Number(s);
}

重要提示:由于除法不能精确到几位小数,在计算完成的时候应根据需要进行适当的四舍五入,以避免产生精度差异。
4. 结论
由于计算机是用二进制来存储和处理数字,不能精确表示浮点数,因此这种精度差异几乎出现在所有的编程语言中(例如C/C++/C#,Java),准确的说:“使用了IEEE 754浮点数格式”来存储浮点类型(float 32,double 64)的任何编程语言都有这个问题!而C#、Java是因为提供了封装类decimal、BigDecimal来进行相应的处理才避开了这个精度差异。
为了避免产生精度差异,把需要计算的数字全升级(乘以10的n次幂)成计算机能够精确识别的整数,等计算完毕再降级(除以10的n次幂),这是大部分编程语言处理精度差异的通用方法。
分享到:
评论
1 楼 495081611 2015-03-18  
数值太大,导致科学计算,最后运算出错怎么解决

相关推荐

    解决JavaScript数字精度丢失问题的方法

    JS 数字精度丢失的一些典型问题 JS 数字精度丢失的原因 解决方案(一个对象+一个函数) 一、JS数字精度丢失的一些典型问题 1. 两个简单的浮点数相加 0.1 + 0.2 != 0.3 // true 这真不是 Firebug 的问题,可以用...

    JavaScript小数点精确计算

    由于JavaScript内部使用的是IEEE 754标准来存储和处理浮点数,这可能导致在进行小数运算时出现精度丢失问题,尤其是在涉及大数字或者循环计算时。本篇将深入探讨这个问题,并提供一些解决方案。 首先,我们来理解...

    浅谈JavaScript中小数和大整数的精度丢失_.docx

    JavaScript中的数字类型主要基于IEEE 754标准的双精度64位浮点数格式进行存储,这在处理小数和大整数时会导致精度丢失问题。本文将深入探讨这两个问题及其背后的原理。 首先,最大整数问题。JavaScript能够表示的...

    js加减乘除丢失精度问题解决方法

    代码如下: /** * 加法运算,避免数据相加小数点后产生多位数和计算精度损失。 * * @param num1加数1 | num2加数2 */ function numAdd(num1, num2) { var baseNum, baseNum1, baseNum2; try { baseNum

    javascript解决小数的加减乘除精度丢失的方案

    在JavaScript开发中,处理小数加减乘除运算时经常会遇到精度丢失的问题。由于JavaScript中的数字是以IEEE 754标准的双精度64位浮点数来表示的,这就意味着它可以精确地表示的整数范围大约在-***到***之间。当超出这...

    javascript避免数字计算精度误差的方法详解

    标题所提到的知识点是关于在JavaScript编程语言中,如何处理和避免在进行数字计算时出现的精度误差问题。这个问题是数字在以浮点数形式存储时,因为计算机的存储架构是以二进制为基础的,导致一些十进制小数在二进制...

    javascript小数精度丢失的完美解决方法.docx

    在JavaScript中处理浮点数时,经常会遇到小数精度丢失的问题。这是由于JavaScript内部使用的是64位浮点数格式(即IEEE 754标准)来表示数值,而这种格式在处理非二进制可精确表示的十进制小数时会产生误差。例如,...

    Java Double 精度问题总结

    这种精度丢失的现象对于需要高精度计算的应用来说是一个常见的问题。本文将详细介绍Java中的 `double` 类型精度问题,并提供几种解决方法。 #### 一、Java Double 精度丢失的原因 1. **二进制表示限制**:`double`...

    javascript小数精度丢失的完美解决方法

    在使用JavaScript进行小数运算时,由于JavaScript的内部运算规则是基于二进制实现的,而大多数小数在转换为二进制形式时无法精确表示,这就导致了小数运算时可能出现精度丢失的问题。例如,当执行0.3*1的运算时,...

    JavaScript 精确计算(2)

    在JavaScript编程语言中,精确计算是一项重要的需求,特别是在金融、科学计算或任何需要...通过深入理解和运用这些知识点,开发者可以有效地在JavaScript环境中实现高精度的数学计算,避免因浮点数不精确而导致的问题。

    js Math.js bigNumber可以解决js运算精度丢失问题

    使用示例: math.config({ number:'BigNumber' }) let result=math.parser().eval(a+ "-" + b); //a,b是需要计算的值,中间是运算符

    javascript解决小数的加减乘除精度丢失的方案.docx

    在JavaScript中处理小数运算时,经常会遇到一个令人头疼的问题——精度丢失。这主要是因为JavaScript中的数字采用IEEE 754标准下的双精度64位浮点数格式表示,而这种表示方法对于某些特定的十进制小数无法做到精确...

    详解JavaScript中精度失准问题及解决方法

    然而,对于更大但仍然可以表示的数字,如果涉及到精确计算,可能会遇到问题,因为超过了53位有效二进制数的限制,会导致精度丢失。为了定义一个可安全进行算术运算的数字范围,JavaScript提供了`Number.MAX_SAFE_...

    浅谈JavaScript中小数和大整数的精度丢失

    然而,由于双精度浮点数的结构限制,JavaScript中的小数(尤其是不能用有限二进制精确表示的小数,如0.1和0.2)和大整数(超过52位的二进制数)常常面临精度丢失的问题。 对于小数的精度丢失问题,由于尾数位数有限...

    java和js的计算精度的实现

    其实在我们使用正常的 + - * / 运算时,在某些情况下就会出现精度丢失的问题,如金额过大时,单纯的加减都有可能出现精度丢失,对于银行项目来说,是很敏感的,需要对每个加减乘除都进行一次方法处理,为此我整理...

    JS大坑之19位数的Number型精度丢失问题详解

    JavaScript中的Number类型在处理大整数时存在精度丢失的问题,特别是在涉及19位或更多位数的整数时。这是由于JavaScript的浮点数表示方式(IEEE 754双精度浮点数)所限制的。JavaScript能精确表示的最大整数是2的53...

    js算法精度失真问题的解决方案

    为了解决上述提到的精度问题,可以通过自定义函数的方式来确保计算过程中的精度不会丢失。下面将详细介绍几种常用的方法,并提供具体的代码实现。 ##### 1. accDiv(arg1, arg2) —— 浮点数除法 此函数用于处理两...

    详解JavaScript 浮点数运算的精度问题

    JavaScript中的浮点数运算精度问题是一个常见的编程挑战,由于JavaScript中的数字是以64位浮点数格式存储,根据IEEE 754标准,这导致在处理浮点数时会出现一些不直观的结果。以下是对这个问题的深入解析。 浮点数...

Global site tag (gtag.js) - Google Analytics