`
阅读更多

【前言】

    本文简单说下JS浮点数表示法(不精确)的解决方法

 

【主体】

    Javascript采用了IEEE-745浮点数表示法,这是一种二进制表示法,可以精确地表示分数,比如1/2,1/8,1/1024。遗憾的是,我们常用的分数都是十进制分数1/10,1/100等,二进制浮点数表示法并不能精确的表示类似0.1这样的简单的数字。所以js浮点数运算会不精准。

    例如:

js加法:9.3+0.3;//结果为9.600000000000001
js加法:9.3-0.7;//结果为8.600000000000001
js乘法:7*0.8;//结果为5.6000000000000005
js除法:9.3/0.3;//结果为31.000000000000004

    解决办法:把浮点数先转换为整数再运算,运算后再对结果转换为小数

 

   我们一般会重写js的四则运算:

//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))
  return (arg1*m+arg2*m)/m
}

//JS减法函数
function Subtr(arg1,arg2){
  var r1,r2,m,n;
  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));
  //动态控制精度长度
  n=(r1>=r2)?r1:r2;
  return ((arg1*m-arg2*m)/m).toFixed(n);
}

//JS乘法函数
function accMul(arg1,arg2){
  var m=0,s1=arg1.toString(),s2=arg2.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)
}

//JS除法函数
function accDiv(arg1,arg2){
  var t1=0,t2=0,r1,r2;
  try{t1=arg1.toString().split()[1].length}catch(e){}
  try{t2=arg2.toString().split()[1].length}catch(e){}
  with(Math){
    r1=Number(arg1.toString().replace(,))
    r2=Number(arg2.toString().replace(,))
    return (r1/r2)*pow(10,t2-t1);
  }
}

 

 

.

分享到:
评论

相关推荐

    js浮点数处理转精确值

    这通常归因于二进制浮点数表示的局限性。本篇文章将深入探讨如何在JavaScript中处理浮点数,确保得到精确的值。 首先,我们需要了解JavaScript中的浮点数是如何存储的。根据IEEE 754标准,JavaScript使用双精度...

    JS浮点数字操作插件floatOPS.js

    "JS浮点数字操作插件floatOPS.js"就是为了解决这个问题而设计的,它提供了四个专门的方法,即加法(add),减法(sub),乘法(mul)和除法(div),旨在确保浮点数运算的精度。 首先,我们来了解一下JavaScript中的浮点数...

    判断输入是否为浮点数

    对于更复杂的情况,例如处理包含科学记数法的浮点数,可能需要更复杂的正则表达式来进行验证。 综上所述,判断输入是否为浮点数的关键在于正确地将字符串转换为浮点数,并妥善处理可能出现的异常。了解不同编程语言...

    JavaScript浮点数及运算精度调整详解

    JavaScript中的浮点数精度问题是由于IEEE-754标准的二进制浮点数表示法导致的,这种表示法无法准确表示所有十进制小数,特别是那些有无限循环二进制小数位的数值,例如0.1。在JavaScript中,所有的数字都以64位双...

    详解JS-- 浮点数运算处理

    总结来说,JavaScript中的浮点数运算误差是由于二进制浮点数表示的局限性造成的。通过保留小数位数或转换为整数运算,我们可以有效地解决这个问题。在实际开发中,应根据项目需求选择合适的处理策略,确保计算结果的...

    JavaScript 浮点数运算 精度问题

    3. **使用库或内置方法**:有些JavaScript库,如`decimal.js`或`big.js`,专门用于处理高精度的浮点数运算,提供更精确的计算结果。 4. **使用toFixed()**:虽然`toFixed()`方法可以将数字格式化为指定位数的小数,...

    JS浮点数运算结果不精确的Bug解决

    一种方法是使用专门处理高精度浮点数的库,如Math.js、decimal.js或big.js,这些库提供了更精确的浮点数运算功能。另一种策略是在知道小数位数的情况下,通过将浮点数放大到整数,进行整数运算后再除以相应的倍数,...

    IEEE754浮点数与十进制数互相转换原理分析

    在计算机科学中,IEEE754标准是用于表示浮点数的一种国际标准,它定义了浮点数的存储格式,使得不同计算机系统之间可以一致地表示和交换浮点数值。这个标准广泛应用于各种编程语言和硬件平台,包括处理器、GPU以及...

    解决JS浮点数运算出现Bug的方法

    造成这种情况的原因,是因为 JavaScript 使用 IEEE 754 浮点数表示法,该表示法会引起舍入误差。这种舍入误差会导致浮点数运算结果不准确。 为了解决这个问题,我们可以使用一些方法来确保浮点数运算的准确性。下面...

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

    JavaScript中的浮点数运算精度问题是一个常见的编程挑战,...总的来说,理解JavaScript浮点数的精度限制以及其背后的原理对于编写健壮的代码至关重要。在需要精确计算的场景下,开发者应采取适当的措施来规避这些问题。

    JavaScript解决浮点数计算不准确问题的方法分析

    有些JavaScript库,如`decimal.js`或`big.js`,专门用于处理高精度的数学计算,避免浮点数的精度问题。如果项目中频繁涉及浮点数计算,可以考虑引入这些库。 总的来说,处理JavaScript中的浮点数精度问题,关键...

    基于IEEE754标准 将一个十六进制转换为十进制浮点数

    IEEE754标准是一个全球广泛采用的浮点数表示法,它定义了如何用二进制形式来存储、运算和交换浮点数。这个标准对于理解和转换不同进制之间的浮点数至关重要。本篇文章将深入探讨基于IEEE754标准将十六进制转换为十...

    跟我学习javascript的浮点数精度

    这反映了双精度浮点数表示法的限制。尽管64位精度已经相当高,但双精度浮点数只能表示一组有限的数字,无法精确表示所有实数。 当涉及到连续运算时,浮点数的不精确性可能会导致积累误差,这在财务计算中尤其需要...

    float-regex:正则表达式以匹配javascript表示法中的浮点数

    浮动正则表达式javascript 表示法中真实浮点值的正则表达式: module . exports = / [ -+ ] ? (?: \d * \. ? \d + | \d + \. ? \d * ) (?: [ eE ] [ -+ ] ? \d + ) ? / ; 不匹配: +/- 无穷大NaN例子锚定一个字符串...

    深入理解JavaScript中的浮点数

    在JavaScript中进行算术运算时,虽然大多数运算符如加法、减法、乘法和除法可以接受整数和浮点数作为参数,但有一些运算符,如按位运算符(如按位或`|`),会先将操作数隐式转换为32位整数。这个转换过程是基于大端...

    8位16进制与浮点double的转换工具

    浮点数表示法,特别是双精度浮点数(double),在编程和计算中广泛使用。双精度浮点数(double)按照IEEE 754标准,使用64位(8字节)来存储一个数值,这包括符号位、指数部分和尾数部分。这个工具能够帮助用户将...

    Javascript浮点数乘积运算出现多位小数的解决方法

    需要注意的是,即使采用了上述方法,也不能保证在所有情况下都能得到完全精确的结果,因为在某些极特殊的情况下,即使使用了放大后再四舍五入的手段,仍然存在由于二进制表示法的局限性导致的微小误差。 总而言之,...

Global site tag (gtag.js) - Google Analytics