`

js中Number数字数值运算后值不对

 
阅读更多

问题:

  37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数)
  我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998
  怎么会这样,两个只有一位小数的数字相乘,怎么可能多出这么小数点出来。
  我Google了一下,发现原来这是JavaScript浮点运算的一个bug。
  比如:7*0.8 JavaScript算出来就是:5.6000000000000005

解决方法:网上找到了一些解决办法,就是重新写了一些浮点运算的函数。
  下面就把这些方法摘录下来,以供遇到同样问题的朋友参考:
 程序代码
//除法函数,用来得到精确的除法结果
//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
//调用:accDiv(arg1,arg2)
//返回值:arg1除以arg2的精确结果
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);
  }
}

//给Number对象增加一个div方法,调用起来更加方便(此处可不要)。
Number.prototype.div = function (arg){
  return accDiv(this, arg);
}

//乘法函数,用来得到精确的乘法结果
//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
//调用:accMul(arg1,arg2)
//返回值:arg1乘以arg2的精确结果
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)
}

//给Number对象增加一个mul方法,调用起来更加方便(此处可不要)。
Number.prototype.mul = function (arg){
  return accMul(arg, this);
}

//加法函数,用来得到精确的加法结果
//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
//调用:accAdd(arg1,arg2)
//返回值:arg1加上arg2的精确结果
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
}

//给Number对象增加一个add方法,调用起来更加方便(此处可不要)。
Number.prototype.add = function (arg){
  return accAdd(arg,this);
}

减法函数

function accSub(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));
//last modify by deeka
//动态控制精度长度
n = (r1 >= r2) ? r1 : r2;
return ((arg1 * m - arg2 * m) / m).toFixed(n);
}



在你要用的地方包含这些函数,然后调用它来计算就可以了。
比如你要计算:7*0.8 ,则改成 (7).mul(8) 
其它运算类似,就可以得到比较精确的结果。

 

问题补充:

JavaScript Number 对象


定义和用法


prototype 属性运行您向对象添加属性和方法。


当构造一个属性, 所有的 Number 对象将被添加上该属性及值。


当构造一个方法时,所有的 Number 对象都会有这个方法。


注意: Number.prototype 不允许引用一个单独的 Number 对象,但是可以使用 Number() 对象。


注意:prototype 型是一个全局对象的构造函数,可用于所有的JavaScript对象


 


 

实例
创建一个方法,给出了数字对象的属性,返回数字的一半价值:
Number.prototype.myMet=function()
{
this.myProp=this.valueOf()/2;
}
创造一个 Number 对象, 调用 myMet 方法:
var n = new Number(55);
n.myMet();
var x = n.myProp; 
x 输出结果:
27.5 

 JavaScript Number() 函数

Number() 函数把对象的值转换为数字

 

返回值

如果参数是 Date 对象,Number() 返回从 1970 年 1 月 1 日至今的毫秒数。

如果对象的值无法转换为数字,那么 Number() 函数返回 NaN。

 

实例

在本例中,我们将尝试把不同的对象转换为数字:

<script type="text/javascript">

var test1= new Boolean(true);
var test2= new Boolean(false);
var test3= new Date();
var test4= new String("999");
var test5= new String("999 888");

document.write(Number(test1)+ "<br />");
document.write(Number(test2)+ "<br />");
document.write(Number(test3)+ "<br />");
document.write(Number(test4)+ "<br />");
document.write(Number(test5)+ "<br />");

</script>

 输出:

 1
0
1256657776588
999
NaN
分享到:
评论

相关推荐

    js中Number数字数值运算后值不对的解决方法.docx

    JavaScript 中 Number 数字数值运算后值不对的解决方法 在 JavaScript 中,对浮点数的运算可能会出现精度问题,例如 `37.5*5.5` 的结果可能不是期待的 `206.08`,而是 `206.08499999999998`。这是因为 JavaScript ...

    js中Number数字数值运算后值不对的解决方法

    我Google了一下,发现原来这是JavaScript浮点运算的一个bug。 比如:7*0.8 JavaScript算出来就是:5.6000000000000005 解决方法:网上找到了一些解决办法,就是重新写了一些浮点运算的函数。 下面就把这些方法摘录...

    JS 能表示的最大数值及JS Number类型数字位数及IEEE754标准1

    JavaScript中的Number类型是基于IEEE 754标准的双精度浮点数(double precision),它在内存中占用64位,其中包括1位符号位、11位指数位和52位尾数。这个标准决定了JavaScript处理数值的方式和所能表示的数值范围。 ...

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

    JavaScript中使用`Number`类型来表示数值,无论是整数还是浮点数。当涉及到浮点数运算时,由于浮点数在计算机内部的二进制表示可能不完全精确,因此可能导致计算结果与预期不符。例如: ```javascript console.log...

    js库bignumber.js_v9.0.2

    在JavaScript开发中,由于JavaScript的Number类型存在精度问题,对于大整数或者高精度浮点数的运算,可能会出现不准确的结果。为了解决这个问题,开发者们通常会使用专门处理大数的库,比如`bignumber.js`。`big...

    bignumber.js-master.zip

    《深入理解JavaScript中的大数运算库bignumber.js》 在JavaScript中,处理大数(超过Number.MAX_SAFE_INTEGER,即2^53 - 1的数值)时,可能会遇到精度丢失的问题,这对于需要精确计算的场景,如金融计算、科学计算...

    前端项目-bignumber.js.zip

    在前端开发中,有时我们需要处理超出JavaScript原生Number类型所能表示范围的数字,例如金融计算、高精度数学运算等场景。在这种情况下,`bignumber.js`是一个非常实用的库,它提供了任意精度的十进制和非十进制算法...

    前端面试题之baseJS-number.zip

    "前端面试题之baseJS_number.zip"这个压缩包聚焦于JavaScript中的基本类型——Number,它是处理数值的基础。在这个压缩包中,我们可以预见到一系列关于Number类型及其相关知识点的问题。以下是对这些知识点的详细...

    JS精度计算1、转成整数计算再转换成小数,2、toFixed,3、math.js,4、bignumber.js,5、big.js

    `bignumber.js`是一个专门处理大数的JavaScript库,支持任意精度的算术运算。这个库可以创建BigNumber对象,这些对象在进行加、减、乘、除等运算时不会丢失精度。例如,`var x = new BigNumber('...

    JavaScript中的Number数字类型学习笔记

    JavaScript中的Number数字类型是该语言的基础组成部分,用于表示整数和浮点数。与其它编程语言不同,JavaScript仅有一个数字类型,无论整数还是浮点数都用同样的表示方式。JavaScript使用IEEE 754格式的64位双精度...

    JavaScript实现检验除法运算

    虽然JavaScript的Number类型可以表示很大范围的数值,但其精度仅到小数点后16位。因此,在处理高精度计算时,可能需要引入如`BigInt`或第三方库如`decimal.js`。 总之,JavaScript实现除法运算检验需要考虑除数为零...

    JavaScript中的数学运算介绍.docx

    NaN(非数字)是JavaScript中用于表示无法表示的数值结果的特殊值。这包括但不限于0/0、Infinity/Infinity、负数开平方根以及将非数字字符串转换为数值的操作。值得注意的是,NaN与其他任何值都不相等,包括它自己。...

    解决JS浮点数(小数)计算加减乘除的BUG

    在JavaScript中,浮点数(小数)的计算可能会出现一些看似奇怪的结果,这主要是由于计算机内部表示浮点数的方式导致的。这个问题是许多开发者在编写JavaScript代码时可能遇到的一个常见陷阱。本文将深入探讨这个问题...

    JavaScript判断数字

    在JavaScript中,处理数字是非常常见的任务,比如验证用户输入是否为数字、进行数学运算或者比较等。本篇将深入探讨JavaScript如何判断一个值是否为数字,并分享一个实用的小程序。 在JavaScript中,可以使用多种...

    JavaScript数字格式化函数

    在JavaScript中,数字格式化是将数值转换为特定格式的过程,比如添加逗号分隔符、保留小数位数、货币格式等。这通常涉及到字符串处理和数学运算。本篇文章将深入探讨JavaScript中的数字格式化函数及其应用。 一、...

    原生JS数字加减法计算求和代码.zip

    在JavaScript(JS)中进行数字加减法计算和求和是一项基本操作,广泛应用于各种Web应用和前端开发中。这个“原生JS数字加减法计算求和代码”压缩包包含了一个实现这些功能的示例。以下是关于这个主题的详细说明。 ...

    JS——Number

    JavaScript中的`Number`类型是用于表示数值的数据类型,它涵盖了整数和浮点数。在JavaScript中,所有的数字都是以`Number`类型存在的,无论是整数还是小数。本篇文章将深入探讨`Number`类型的相关知识点,包括其特性...

Global site tag (gtag.js) - Google Analytics