decimal.JS 快速入门

JavaScript046

decimal.JS 快速入门,第1张

title: Decimal快速入门

author: 作者

top: false

toc: false

date: 2020-03-11 09:56:46

tags:

想必大家在用js 处理 数字的 加减乘除的时候,或许都有遇到过 精度不够 的问题

还有那些经典的面试题 02+0.1 == 0.3

至于原因,那就是 js 计算底层用的 是 ,精度上有限制

那么, Decimal.js 就是帮助我们解决 js 中的精度失准的问题

Decimal 官方git

Decimal官方api

这个问题我已回答过一次,参照:http://zhidao.baidu.com/question/535864681?&oldq=1

其实这是js作浮点运算的一个bug。

在JavsScript中,变量在存储时并不区分number和float类型,而是统一按float存储。而javascript使用IEEE 754-2008 标准定义的64bit浮点格式存储number,按照IEEE 754的定义:

decimal64对应的整形部分长度为10,小数部分长度为16,所以默认的计算结果为“7.0000000000000001”,如最后一个小数为0,则取1作为有效数字标志。

顺便解决方案也给你吧:【注:以下代码并非原创】

使用方法:

(1).mul(0.2)+(2).mul(0.2)+0*0.6

<script>

//加法函数,用来得到精确的加法结果

//说明: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)

}

Number.prototype.mul = function (arg){

return accMul(arg,this)

}

//乘法函数,用来得到精确的乘法结果

//说明: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.prototype.div = function (arg){

return accDiv(arg,this)

}

//除法函数,用来得到精确的除法结果

//说明: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)

}

}

</script>

<!DOCTYPE html>

<html>

<head>

<title>By Qmlu</title>

<style>

.integral { font-size:30pxcolor:red}

.decimal { font-size:18pxcolor:green}

</style>

</head>

<body>

<p class="num">1234567.45678</p>

<p class="num">0</p>

<p class="num">123</p>

<p class="num">3.1415926</p>

<script>

var tags = document.getElementsByTagName('p')

for(var i = 0, len = tags.lengthi <leni++) {

var num = tags[i].innerHTML

if(num.indexOf('.') == -1) {

tags[i].innerHTML = '<span class="integral">' + num + '<\/span>'

} else {

var integral = num.substring(0, num.indexOf('.'))

var decimal = num.substring(num.indexOf('.'))

tags[i].innerHTML = '<span class="integral">' + integral + '<\/span><span class="decimal">' + decimal + '<\/span>'

}

}

</script>

</body>

</html>

因为是通过小数点分割小数的,所以当不是小数的时候就会有问题。

我改了一下。你再看看吧。

不可能。。。