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

115人阅读 评论(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,进入无限循环。

查看评论

解决 double float 数据运算不精确的问题

先运行一段代码看看结果再说: 【代码】 结果: 0.060000000000000005 0.5800000000000001 401.49999999999994 1.23299999999...
  • mffandxx
  • mffandxx
  • 2016-01-09 11:45:54
  • 2172

精确运算避免使用float和double

在《你可能不知道的Java基础知识(一)》中,我提到使用浮点运算要慎重,感觉说的不够透彻,其实float和double类型主要是为科学和工程计算而设计的。他们执行的是二进制浮点运算,由于二进制的局限性...
  • tin0x
  • tin0x
  • 2010-12-03 02:10:00
  • 899

各类数值型数据间如何混合运算?

整型(包括int,short,long)、实型(包括float,double)可以混合运算。前已述及,字符型数据可以与整型通用,因此,整型、实型、字符型数据间可以混合运算。例如: 10+'a'+1....
  • u012150179
  • u012150179
  • 2014-03-19 22:40:15
  • 3902

c语言中int与float数据运算时,数据转换问题

谭浩强 第三版 c语言程序设计 5
  • shihao1001
  • shihao1001
  • 2014-04-25 14:57:28
  • 211

金融、支付行业的开发者不得不知道的float、double计算误差问题

在大多数行业涉及到浮点数的计算的场景比较少,但是在金融、支付行业就比较多了,而且在这两个行业一个小小的错误 可能将会给公司带来极大的损失。 在浮点运算中,浮点运算很少是精确的。虽然一些数字(譬如 0....
  • Mr_Smile2014
  • Mr_Smile2014
  • 2016-08-08 20:29:19
  • 4296

对于double和float类型运算精度丢失,请使用BigDecimal

祝福之链接,基本用法 BigDecimal用法详解 一、简介 Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点...
  • u011150924
  • u011150924
  • 2016-10-27 11:28:49
  • 1092

Java浮点类型(Double/Float)运算精度问题

问题的提出: 如果我们编译运行下面这个程序会看到什么? public class Test{ public static void main(String args[]){ ...
  • zmx729618
  • zmx729618
  • 2017-05-24 17:09:40
  • 743

不同的类加载器加载的类不是同一个类

一,有两个术语,一个叫“定义类加载器”,一个叫“初始类加载器”。比如有如下的类加载器结构:bootstrap  ExtClassloader    AppClassloader    -自定义clsl...
  • qq_26222859
  • qq_26222859
  • 2016-09-20 21:30:33
  • 1889

【C++学习笔记】对float型数据类型和double型数据的理解

简单的说,float型数据是指用科学计数法储存的数据。 在内存中,float型数据的储存分两部分:第一部分:0.123456(六位小数,小于1),第二部分:10^n(控制小数点的位置)。 这种储存...
  • RepentMan
  • RepentMan
  • 2017-05-01 19:40:03
  • 254

javascript中0.1 + 0.2 != 0.3?

javascript中0.1 + 0.2竟然与0.3不相等,这是BUG吗?
  • haihuan2004
  • haihuan2004
  • 2016-10-23 12:06:26
  • 1638
    个人资料
    持之以恒
    等级:
    访问量: 8万+
    积分: 2261
    排名: 2万+
    最新评论