关于float中0.3一类数据的运算解决办法

原因是此类数据无法用二进制完整表示,完全是无限循环数据。

运算结果解决办法:

方法一:使用github上的库:BigDecimal.jsbignumber.js

方法二:在这篇文章里面找到一个简单的函数。

}

可以将每次的运算结果赋值给它,从而得到比较精确的结果。·

方法三:使用简单点四舍五入方法,其实跟上面的方法差不多,只不过取了一个10位小数。

function numTofixed(num) {
    if (typeof num == 'number') {
        num = parseFloat(num.toFixed(10))
    }
    return num;
}
numTofixed(0.1 + 0.2);

方法二的正则表达式解读:·

//code from http://caibaojian.com/float-point-math.html
match=str.match(/\.(\d*?)(9|0)\2{5,}(\d{1,5})$/);
  • match()·

  • 在字符串内检索指定的值,找到一个或多个正则表达式的匹配
  • stringObject.match(searchvalue)
  • stringObject.match(regexp)
  • 返回匹配结果的数组,数组内容依赖于regexp是否具有全局标志g。

例如下面这个

var d = '55 ff 33 hh 77 tt'.match(/\d+/g); // d = ["55", "33", "77"]
再看一下表达式里面有一个\2{5,},这个\2表示跟第二个表达式匹配,即跟(9|0)这个相同。涉及到子表达式和捕获,反向引用的概念
  • 一个子表达式是一个整体,可重复后面引用
  • /(\d)(\d)\2\1/gi; 第二位和第三位相同,第一位和第四位相同
  • /(\d)\1(\d)\2(\d)\3(\d)4/; aabbccdd形式的数字
  • /(\d){5}-(\d)\2\2(\d)\3\3(\d)\4\4/gi; 12345-111222333

假如我们使用·

fixFloatCalcRudely(0.1+0.2) //[".30000000000000004", "3", "0", "4"]

由于没有加全局,所以会输出全部结果,第一个元素匹配整个字符串,第二个开始与圆括号内的子表达式相匹配的子串结果。由于我们输出只有0.3后面都是0,进入无限循环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值