精华内容
下载资源
问答
  • 在python中浮点数计算是不精确的的,想要精确计算浮点数,需要调用decimal这个模块 decimal是十进制类型 decimal.Decimal(x) #x可以是一个整数或字符串,但不能是浮点数 import decimal a = decimal.Decimal...

    python精确计算

    在python中浮点数计算是不精确的的,这是因为小数以二进制形式表示时的有穷性导致的。想要精确计算浮点数,需要调用decimal这个模块,decimal是十进制类型

    在这里插入图片描述
    decimal.Decimal(x) #x可以是一个整数或字符串,但不能是浮点数

    import decimal
    a = decimal.Decimal(9876)
    b = decimal.Deciaml(“54321.01234567898754321”)
    a + b
    Decimal(‘64197.012345678987654321’)

    decimal.Deciaml.from_float(x); #x可以是一个浮点数

    Deciaml.from_float(0.1)
    Decimal(‘0.1000000000000000055511151231257827021181583404541015625’)

    Decimal.from_float(float(‘nan’));
    Decimal(‘NaN’)

    Decimal.from_float(float(’-inf’));
    Decimal(’-Infinity’)

    Python 中的 float 类型使用C语言的 double 类型进行存储。 float 对象的值是以固定的精度(通常为 53 位)存储的二进制浮点数,由于 Python 使用 C 操作,而后者依赖于处理器中的硬件实现来执行浮点运算。 这意味着就浮点运算而言,Python 的行为类似于许多流行的语言,包括 C 和 Java。

    许多可以轻松地用十进制表示的数字不能用二进制浮点表示。例如,之后:

    x = 1.2

    为 x 存储的值是与十进制的值 1.2 (非常接近) 的近似值,但不完全等于它。 在典型的机器上,实际存储的值是:

    1.0011001100110011001100110011001100110011001100110011 (binary)
    确切地说:

    1.1999999999999999555910790149937383830547332763671875 (decimal)
    典型的 53 位精度为 Python 浮点数提供了 15-16 位小数的精度。

    展开全文
  • js 浮点数计算误差解决方法

    千次阅读 2018-09-13 14:00:48
    计算机编程语言里浮点数计算会存在精度丢失问题(或称舍入误差),其根本原因是二进制和实现位数限制有些数无法有限表示 * 以下是十进制小数对应的二进制表示 * 0.1 >> 0.0001 1001 1001 1001…...

    eg:一个整数*一个小数出现的结果是

    计算机编程语言里浮点数计算会存在精度丢失问题(或称舍入误差),其根本原因是二进制和实现位数限制有些数无法有限表示
     * 以下是十进制小数对应的二进制表示
     *      0.1 >> 0.0001 1001 1001 1001…(1001无限循环)
     *      0.2 >> 0.0011 0011 0011 0011…(0011无限循环)
     * 计算机里每种数据类型的存储是一个有限宽度,比如 JavaScript 使用 64 位存储数字类型,因此超出的会舍去。舍去的部分就是精度丢失的部分。
    核心方法:实现加减乘除运算,确保不丢失精度
         * 思路:把小数放大为整数(乘),进行算术运算,再缩小为小数(除)


     

     

    转载出自https://www.cnblogs.com/SuperLiangG/p/5964439.html

    展开全文
  • js浮点数乘法是有误差的,这个问题是在很久以前一次项目计算中发现的,那么接下来就说一下如何修正这个误差。 下面直接上代码吧,简单来说就是以小数点为基准进行切割,将是浮点数的转为整数进行计算,最后再放大...

    js浮点数乘法是有误差的,这个问题是在很久以前一次项目计算中发现的,那么接下来就说一下如何修正这个误差。

    下面直接上代码吧,简单来说就是以小数点为基准进行切割,将是浮点数的转为整数进行计算,最后再放大小数点后N倍还原正确计算结果。

    =========> 比如计算 0.14*10
    
    // 直接答案 1.4000000000000001 这显然不是我们想要的结果
    
    function accMul(arg1, arg2) {
    
    	let m = 0;
    	const s1 = arg1.toString();
    	const s2 = arg2.toString();
    
    	if (s1.includes('.')) {
    		m += s1.split('.')[1].length;
    	}
    
    	if (s2.includes('.')) {
    		m += s2.split('.')[1].length;
    	}
    
    	return Number(s1.replace('.', '')) * Number(s2.replace('.', '')) / Math.pow(10, m);
    }
    
    //调用accMul accMul(0.14, 10) 得到 1.4 这才是我们想要的
    
    展开全文
  • 1 概述 浮点数指的是带有小数的数值,浮点运算即是小数的四则运算,常用来测量电脑运算速度。大部份计算机采用二進制...2 误差现象 console.log(0.1+0.2); // 输出 0.30000000000000004 console.log(0.15+0.15); // ...

    1 概述

    浮点数指的是带有小数的数值,浮点运算即是小数的四则运算,常用来测量电脑运算速度。大部份计算机采用二進制(b=2)的表示方法。位(bit)是衡量浮点数所需存储空间的单位,通常为32位或64位,分别被叫作单精度和双精度。

    2 误差现象

    console.log(0.1+0.2);    // 输出 0.30000000000000004
    console.log(0.15+0.15);  // 输出 0.3
     
    console.log(0.7+0.1);    // 输出 0.7999999999999999
    console.log(0.6+0.2);    // 输出 0.8
     
    console.log(0.3*3);      // 输出 0.8999999999999999
    console.log(3*3/10);     // 输出 0.9
    

    从以上现象可以看出,并不是所有的浮点数运算都会出问题,只是部分。

    0.7+0.1 输出有偏差

    0.6+0.2 输出正确

    具体是什么原因呢,继续向下看。

    3 误差原因

    不仅仅是JS,大多数语言在处理浮点数的时候都会遇到精度问题,准确的说,所有支持二进制浮点数运算(绝大部分都是 IEEE 754 的实现)的系统都存在这个现象。
    其原因就是,在有限的存储空间下,绝大部分的十进制小数都不能用二进制浮点数来精确表示。例如,0.1 这个简单的十进制小数就不能用二进制浮点数来表示。所谓「计算机浮点数」,其实就是二进制的「科学计数法」。在十进制中,科学计数法的形式是:
    在这里插入图片描述
    相应的,二进制的科学计数法就是:
    在这里插入图片描述
    而在有限的存储空间下,十进制小数 0.1 无论如何也不能用这种形式来表示,因此,计算机在存储它时,产生了精度丢失,所以就出现了问题中所描述的现象。
    更详细的可以点击链接查看 https://www.zhihu.com/question/20679634

    4 解决方案

    如何解决呢?看这个例子:

    console.log(0.3*3);      // 输出 0.8999999999999999
    console.log(3*3/10);     // 输出 0.9
    

    浮点数计算有问题,整数计算是没问题的,那么将浮点转化成整数运算,之后再切回浮点就可以保证没有偏差了

    注:不推荐js做太多的浮点运算。

    以下方法可以帮助你修正浮点运算的偏差:

    // 浮点数求和
    function add(a, b) {
        var c, d, e;
        try {
            c = a.toString().split(".")[1].length;
        } catch (f) {
            c = 0;
        }
        try {
            d = b.toString().split(".")[1].length;
        } catch (f) {
            d = 0;
        }
        return e = Math.pow(10, Math.max(c, d)), (mul(a, e) + mul(b, e)) / e;
    }
     
    // 浮点数相减
    function sub(a, b) {
        var c, d, e;
        try {
            c = a.toString().split(".")[1].length;
        } catch (f) {
            c = 0;
        }
        try {
            d = b.toString().split(".")[1].length;
        } catch (f) {
            d = 0;
        }
        return e = Math.pow(10, Math.max(c, d)), (mul(a, e) - mul(b, e)) / e;
    }
     
    // 浮点数相乘
    function mul(a, b) {
        var c = 0,
            d = a.toString(),
            e = b.toString();
        try {
            c += d.split(".")[1].length;
        } catch (f) {}
        try {
            c += e.split(".")[1].length;
        } catch (f) {}
        return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c);
    }
     
    // 浮点数相除
    function div(a, b) {
        var c, d, e = 0,
            f = 0;
        try {
            e = a.toString().split(".")[1].length;
        } catch (g) {}
        try {
            f = b.toString().split(".")[1].length;
        } catch (g) {}
        return c = Number(a.toString().replace(".", "")), d = Number(b.toString().replace(".", "")), mul(c / d, Math.pow(10, f - e));
    }
    

    验证

    console.log(0.1+0.2);        // 输出 0.30000000000000004
    console.log(add(0.1, 0.2));  // 输出 0.3
     
    console.log(0.7+0.1);        // 输出 0.7999999999999999
    console.log(add(0.7, 0.1));  // 输出 0.8
     
    console.log(0.3*3);          // 输出 0.8999999999999999
    console.log(mul(0.3, 3));    // 输出 0.9
    

    博文部分来自知乎和其它博客,感谢!

    展开全文
  • 二进制表示法的理解是转载自 阮一峰的blog ---------------------------------------- ...alert(n1==n2) //false 由于javascript和很多其他语言一样都是采用 二进制浮点数表示法表示浮点数的,所以...
  • 因为float一共只有6位有效数字(10进制),如果整数部分的位数多了,相应的小数部分的位数就少了,因此当一个很大的数(如100000)去加一个很小的数(如0.1),就会形成很大的误差 用楼主的累加方式,一开始误差不大...
  • 【python】浮点数计算时的误差问题

    千次阅读 2019-05-06 19:45:31
    python不建议直接将两个浮点数进行精确的计算,因为python中的浮点数计算存在一个误差问题,例如: 出现这种问题的原因是,计算机中保存数字的寄存器是使用二进制来保存数字的,有的有限十进制小数只能使用无限的二...
  • Matlab浮点数累加误差

    2020-12-18 13:23:47
    ## Matlab浮点数累加误差引起的判断错误 第一次发文,记录一下,用词不当,还望指正。 在使用Matlab的过程中,进行了如下的一次循环,(Q_site=[0,2],sub_Q初始化为1),如果使用(Q_site[1,sub_Q]+0.1==i)直接判断...
  • 1.浮点数运算误差

    2016-03-06 14:01:01
     浮点数计算可能存在误差,如正确答案为1,实际存储值为0.999999999 int main(){ double a=0.99999; int b=a; cout; return 0; } 如上例,由于转换为整数后的值为“不超过a的最大整数”,结果b==0 ...
  • 浮点数运算误差解决

    千次阅读 2019-06-05 09:54:23
    在进行数据计算时,小数也就是浮点数拥有不低的出场率。在常人看来,机器也就是计算机的数据运算是不会出错的,没错,计算机进行数据运算的确不会犯错,但小数运算的误差是免不了的。 来试一试。 在JS中写上...
  • 关于float浮点数误差分析

    千次阅读 2018-06-03 12:35:29
    浮点型简单讲就是实数的意思。...如下图代码所示,理论上我们输出的数字应该是4000,但结果确是4001.552979,这就说明float浮点数是存在误差的那么这些误差值是为何而来呢其实那是因为精度越来越高,占字节数...
  • 一种是整数,一种是浮点数浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示随意某个实数。详细的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中一般是2)的整数次幂得到...
  • 浮点数运算误差原因分析

    千次阅读 2019-03-31 09:36:48
    我们知道,单精度浮点数运算时会产生误差,但是误差具体是如何产生的?本篇博文将详细分析float浮点数在运算时产生误差的原因,我们首先通过一段C代码来进行浮点运算 C代码 #include <stdlib.h> #include &...
  • 浮点数计算后,不明确小数位数,解决误差问题 浮点数计算后会出现误差,一般用round可以解决,但是如果需求小数位数要和原结果一致(如1.5-0.2=1.3结果就是一位小数,1.52-0.21=1.31结果就是2位小数),用round解决不...
  • float经过多次运算后其储存的值可能出现误差 这时可以使用floor函数解决 floor函数的作用是取浮点数整数部分 一般采用floor(i+0.5);//i为变量
  • 在项目中计算商品价格的时候再次遇到js浮点数计算出现误差的问题,以前一碰到这个问题就用tofixed方法进行处理一下,这对于一个程序员来说是及其不严谨的。 何况用tofixed方法也是有问题的,解决办法参考之前的一篇...
  • 只不过在 C++/C#/Java 这些语言中已经封装好了方法来避免精度的问题,而 JavaScript 是一门弱类型的语言,从设计思想上就没有对浮点数有个严格的数据类型,所以精度误差的问题就显得格外突出。  我们知道,能被...
  • 浮点数计算   浮点数:带有小数点的数叫浮点数,一个运算中只要有一个数值是浮点数,JAVA就会把这个运算中其他的整数自动变为浮点数,然后进行浮点运算。int表示整型,double表示浮点型 有int price, 也就有...
  • 浮点数的存储误差 实例程序代码 #例2-4-2 浮点数 print(&quot;0.1 + 0.1 = &quot;, 0.1 + 0.1) print(&quot;0.1 - 0.1 = &quot;, 0.1 - 0.1) print(&quot;0.1 * 0.1 = &quot;, 0.1 * ...
  • 浮点数计算相关库

    2018-11-30 14:02:15
    1、常见精度问题如:0.1+0.2,1.1*1.1 2、有很多同学将浮点数扩大成整数,直接乘以10^N,其实这也会可能导致误差,例如 0.57...记住,包含浮点数的加减乘除都可能导致计算误差。(参考:https://zhuanlan.zhihu.com...
  • 众所周知,C和C++中,经常用到的浮点数类型无论是float类型还是double类型都存在一定的精度与误差,关于float与double所表示的范围如下: double的精度足够日常使用,但是浮点数在计算机内部存储的时候存在的误差...
  • 成因:对于浮点数计算,所有的语言都有误差,只是对于c、c++、java等高级语言,已经封装处理过了,而对于js这种弱语言,设计之初就没考虑对浮点数进行严格的控制,所以有该问题。当4.35 用二进制表...
  • 浮点数误差问题

    2012-11-07 08:48:00
    1.浮点数强制转换成整数时,舍入误差严重加重,强制转换时会舍弃非整数部分。 double d=29*0.01;//d=0.29 d=((int)d*100);//d=28 2.科学计数表示法中二进制位数越多,精度就越高。64位double就比32位的float...
  • 应为floor(c)当浮点数计算时如果
  • JS浮点数计算失精

    千次阅读 2017-02-11 16:43:55
    JS浮点数计算失精问题:二进制浮点数表示法并不能精确的表示类似0.1这样 的简单的数字,四舍五入到最接近的可表示的实数。执行一系列的运算,随着舍入误差的积累,运算结果会越来越不精确。舍入也会使我们通常所期望...
  • 在javascript中的浮点数计算不准确。javascript的两个浮点数算法结果会有误差。 加减法 原理:取小数位多的一个(Math.max(r1,r2))将加数都乘以10的m次方(变成整数)相加后再除以m,得出精确数据 乘...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,109
精华内容 6,043
关键字:

整数浮点数计算误差