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>
因为是通过小数点分割小数的,所以当不是小数的时候就会有问题。
我改了一下。你再看看吧。
不可能。。。