JS对Float型数字加减乘除bug

本文探讨了JavaScript中浮点数运算导致的精度问题,并提供了解决方案。通过使用math.js库,能够有效地避免浮点数运算时出现的精度丢失现象。

问题

0.3*23=6.9

用JS算了一个结果为:6.8999999999999995

怎么会这样,两个只有一位小数的数字相乘,怎么可能多出这么小数点出来。

比如:24*0.6 JavaScript算出来就是:14.399999999999999

其实根本原因是浮点型在内存中的存储方式和精度标准造成的,详细可以百度,一大堆。

解决思路

引入第三方js库 math.js  或者 BigNumber.js

下面介绍一下math.js,止于BigNumber.js自行研究,同理。

http://cdnjs.cloudflare.com/ajax/libs/mathjs/5.0.0/math.js

或者在这下载链接: http://pan.baidu.com/s/1Zl07PbA6erv42i7SWAH5yA 提取码: axsm

<span style="color:#2c3e50"><span style="background-color:rgba(255, 255, 255, 0.8)"><span style="background-color:#f5f2f0"><span style="color:#000000"><code class="language-javascript">引入:

页面入口处统一配置:
math<span style="color:#999999">.</span><span style="color:#dd4a68">config</span><span style="color:#999999">(</span><span style="color:#999999">{</span>
    <span style="color:#990055">number</span><span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">:</span></span> <span style="color:#669900">'BigNumber'</span><span style="color:#999999">,</span>  
    <span style="color:#708090">// 'number' (default), </span>
    <span style="color:#990055">precision</span><span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">:</span></span> <span style="color:#990055">20</span>         
<span style="color:#999999">}</span><span style="color:#999999">)</span><span style="color:#999999">;</span></code></span></span></span></span>

原来算法:

var count=price*number;

修改后算法:

price=math.bignumber(price);  //数据类型转换
number=math.bignumber(number);   //数据类型转换
var count=price*number;  //运算
count=math.number(count);  //转换结果为数字,否则提取的是对象

注:常用的几个算法

运算

方法名

参数

备注

math.add(a,b,c,…)

参数个数>=2

得到几个数字的和

math.subtract(a,b)

参数个数=2

得到 a-b 的结果, 不可连减

math.multiply(a,b,c,…)

参数个数>=2

得几个参数的乘积

math.divide(a,b)

参数个数=2

得到 a/b 的结果 ,不可连除

转换为bigNumber类型

math.bignumber(a)

浮点数,进行运算时,转换成bigNumber才能保证得到精确的结果

转换为数字类型

math.number(a)

bignumber为对象,此方法可以获取对象中的数字部分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值