关闭

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

84人阅读 评论(0) 收藏 举报
分类:

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

运算结果解决办法:

方法一:使用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,进入无限循环。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:61661次
    • 积分:2004
    • 等级:
    • 排名:千里之外
    • 原创:137篇
    • 转载:12篇
    • 译文:0篇
    • 评论:14条
    最新评论