问题:
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 数字数值运算后值不对的解决方法 在 JavaScript 中,对浮点数的运算可能会出现精度问题,例如 `37.5*5.5` 的结果可能不是期待的 `206.08`,而是 `206.08499999999998`。这是因为 JavaScript ...
我Google了一下,发现原来这是JavaScript浮点运算的一个bug。 比如:7*0.8 JavaScript算出来就是:5.6000000000000005 解决方法:网上找到了一些解决办法,就是重新写了一些浮点运算的函数。 下面就把这些方法摘录...
JavaScript中的Number类型是基于IEEE 754标准的双精度浮点数(double precision),它在内存中占用64位,其中包括1位符号位、11位指数位和52位尾数。这个标准决定了JavaScript处理数值的方式和所能表示的数值范围。 ...
JavaScript中使用`Number`类型来表示数值,无论是整数还是浮点数。当涉及到浮点数运算时,由于浮点数在计算机内部的二进制表示可能不完全精确,因此可能导致计算结果与预期不符。例如: ```javascript console.log...
在JavaScript开发中,由于JavaScript的Number类型存在精度问题,对于大整数或者高精度浮点数的运算,可能会出现不准确的结果。为了解决这个问题,开发者们通常会使用专门处理大数的库,比如`bignumber.js`。`big...
《深入理解JavaScript中的大数运算库bignumber.js》 在JavaScript中,处理大数(超过Number.MAX_SAFE_INTEGER,即2^53 - 1的数值)时,可能会遇到精度丢失的问题,这对于需要精确计算的场景,如金融计算、科学计算...
在前端开发中,有时我们需要处理超出JavaScript原生Number类型所能表示范围的数字,例如金融计算、高精度数学运算等场景。在这种情况下,`bignumber.js`是一个非常实用的库,它提供了任意精度的十进制和非十进制算法...
"前端面试题之baseJS_number.zip"这个压缩包聚焦于JavaScript中的基本类型——Number,它是处理数值的基础。在这个压缩包中,我们可以预见到一系列关于Number类型及其相关知识点的问题。以下是对这些知识点的详细...
`bignumber.js`是一个专门处理大数的JavaScript库,支持任意精度的算术运算。这个库可以创建BigNumber对象,这些对象在进行加、减、乘、除等运算时不会丢失精度。例如,`var x = new BigNumber('...
JavaScript中的Number数字类型是该语言的基础组成部分,用于表示整数和浮点数。与其它编程语言不同,JavaScript仅有一个数字类型,无论整数还是浮点数都用同样的表示方式。JavaScript使用IEEE 754格式的64位双精度...
虽然JavaScript的Number类型可以表示很大范围的数值,但其精度仅到小数点后16位。因此,在处理高精度计算时,可能需要引入如`BigInt`或第三方库如`decimal.js`。 总之,JavaScript实现除法运算检验需要考虑除数为零...
NaN(非数字)是JavaScript中用于表示无法表示的数值结果的特殊值。这包括但不限于0/0、Infinity/Infinity、负数开平方根以及将非数字字符串转换为数值的操作。值得注意的是,NaN与其他任何值都不相等,包括它自己。...
在JavaScript中,浮点数(小数)的计算可能会出现一些看似奇怪的结果,这主要是由于计算机内部表示浮点数的方式导致的。这个问题是许多开发者在编写JavaScript代码时可能遇到的一个常见陷阱。本文将深入探讨这个问题...
在JavaScript中,处理数字是非常常见的任务,比如验证用户输入是否为数字、进行数学运算或者比较等。本篇将深入探讨JavaScript如何判断一个值是否为数字,并分享一个实用的小程序。 在JavaScript中,可以使用多种...
在JavaScript中,数字格式化是将数值转换为特定格式的过程,比如添加逗号分隔符、保留小数位数、货币格式等。这通常涉及到字符串处理和数学运算。本篇文章将深入探讨JavaScript中的数字格式化函数及其应用。 一、...
在JavaScript(JS)中进行数字加减法计算和求和是一项基本操作,广泛应用于各种Web应用和前端开发中。这个“原生JS数字加减法计算求和代码”压缩包包含了一个实现这些功能的示例。以下是关于这个主题的详细说明。 ...
JavaScript中的`Number`类型是用于表示数值的数据类型,它涵盖了整数和浮点数。在JavaScript中,所有的数字都是以`Number`类型存在的,无论是整数还是小数。本篇文章将深入探讨`Number`类型的相关知识点,包括其特性...