首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

计算误差的真相:为什么 float 加法会出现精度损失?

一、什么是float类型及其特点 1.1、float类型的定义和使用方法float(浮点数)是一种在计算机编程中常用的数据类型,它用于表示带小数点的数字。...二、为什么会出现float相加精度损失?浮点数在计算机内部是以二进制表示的,但是很多十进制小数无法完全用二进制精确表示,因此在进行浮点数的加减乘除等运算时,可能会出现一定程度的精度损失。...这是由于计算机只能使用有限的位数来表示数字,而且在计算过程中会发生舍入误差。如果参与运算的两个浮点数的小数位数比较多或者差异较大,那么可能会导致精度损失更大。...这是因为计算机无法完全表示0.1和0.2的精确值,因此在计算时会存在一定的误差。类似地,当进行多次浮点数运算时,每次运算都可能会使误差累积,从而导致最终结果与实际结果之间的误差变得更大。...例如,在计算机图形学中,使用浮点数可以表示3D空间中的坐标和向量。在科学计算、金融分析等领域中,也常常需要对小数进行精确计算,此时使用高精度的浮点数类型也是很有用的。

89200

BigDecimal用错了,哭晕在厕所。。。

前言 在日常开发中,很多小伙伴喜欢用 BigDecimal 来处理精确计算,比如钱、分数、比例啥的。...这不是 BigDecimal 的问题,而是浮点数本身的“锅”。 在Java中,double的精度有限的,0.1 转换成二进制是个无限循环小数,直接传进去会带上误差。...+) { sum.add(new BigDecimal("1")); } 打印结果:0 问题原因是 add 方法不会改变原对象,而是返回一个新的 BigDecimal 实例。...那么,我们要如何优化呢? 答:用变量接住返回值。...写在最后 BigDecimal 是个非常强大的数字类工具,但也是个“细节狂魔”。 只有用对了,你才能真正享受它带来的好处,否则就是自找麻烦。 希望这篇文章能帮到你,不要再踩坑。

11210
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    盘点Excel中的那些有趣的“bug”

    经过测试在Excel中并不存在2100年2月29日,那为什么只有1900年这一天错了?...可是在输入30/12/31却又变会1930年了,Excel按照什么规则判断年份呢? ?...简而言之,计算机计算过程使用二进制,对于1.2-1.1的结果为2进制循环小数,在存储时会进行小数截断,导致出现误差。...对于所有操作计算都做两次ROUND过于繁琐,这里可以使用Excel提供的另一个设置,使用“显示精度”,这样Excel在存储计算时,会按照单元格设置的显示小数位数来保留精度。 ?...如截图,单元格中对SUM结果为0,同时单元格左上角有绿色三角提示“以文本形式存储的数字“。这个提示就是SUM结果为0的原因,这些数字实际存储格式为文本,而文本并不参加数字的运算。

    89720

    为什么0.1 + 0.2 不等于 0.3 ?

    而以下几个计算式却能得到我们想要的结果:这是为什么呢?...在二进制中,,浮点数通常使用 IEEE 754 标准进行表示,无法准确表示的小数有 0.1、0.2 或 0.3 这样的数字,因为它使用的是二进制浮点格式。...而 1/3、1/6 和 1/7 是无限循环的小数,因为分母使用了 3 或 7 的质因数。在二进制(计算机使用的系统)中,如果一个分数使用基数(2)的质因数来表示,那么它可以被精确地表示。...这个无限循环的模式 0011 会一直重复下去,因为二进制系统只能通过这种方式来近似表示十进制中的 0.1。在实际的计算机系统中,这个无限循环的小数会被截断为有限位数,以便存储和计算。...()方法虽然在显示上解决了问题,但它并没有改变数字的实际值,它只是改变了数字的表示形式。

    14110

    浮点数美丽的表象(为什么要慎用浮点数)

    输出应该是2000w的,但为什么少了3222784.0,如果在生成环境中,这意味着我们的钱凭空消失了3222784.0!why?...这其实是float累加过程中精度丢失导致的,要理解这点我们首先要理解什么是浮点数。首先我们了解数在计算机中是如何表示的,因为计算机只能理解0和1两个数,所以一切信息都是用二进制表示的。...没错,在计算机中也是这么做的,只不过用的是2进制而已。 float使用了4个字节来存储数据,总共32位,最高位作为符号位,最高2-9位作为指数位,最后的23位才作为有效数位。...注意,23位之前有个1被省略掉了,所以他的有效位其实是24位,float所能表示的有效数值只有$2^{24}$,大概8位数,因此它不能标识超过8位的有效数字,否则会丢失精度,这就是浮点数美丽的表象。...上面的代码一直+1,当sum大于16777216之后,1.0为了和sum的指数位对其,它的有效数会右移动24次,上面说到float的有效数只有24位,所以它会完全变成0。

    1.1K20

    day 15 - 1 内置函数

    id()  hash() #id(o) o 是参数,返回一个变量的内存地址 #hash() - 对于相同可 hash 数据的 hash 值在一次程序的执行过程中总是不变的 # - 字典的寻址方式...# eval 有返回值 —— 有结果的简单计算 # exec 没有返回值 —— 简单的流程控制 # eval 只能用在你明确知道你要执行的代码是什么,因为有很大的安全隐患 #exec 举例说明...+ 15j # j 是 python 中虚数的单位 # 浮点数(有限循环小数,无限循环小数) !...* 10 #在这个过程中小数点是浮动的所以叫做浮点数 f = 1.781326913750135970 #当小数很长是 会出现不准确的情况 print(f) #因为十进制的小数在转为二进制小数时会出现微弱的偏差...求和 #min 计算最小值 #max 计算最大值 #可以传两个值 ret = sum([1,2,3,4,5,6]) print(ret) ret = sum([1,2,3,4,5,6

    39210

    新人必备!15个常用EXCEL函数

    函数SUM就是用来承担这个任务的。SUM的参数可以是单个数字、一组数字,因此SUM的加法运算功能十分强大。...例如,如果A1:A10是COUNT函数的参数,但是其中只有两个单元格含有数字,那么COUNT函数返回的值是2。...函数只有一个参数,语法结构是: =INT(number) 相反,ROUND函数是将一个数字的小数部分四舍五入。函数有两个参数:需要计算的数字和需要四舍五入的小数位数。...这两个函数的第一个参数是需要查找的值,如果在表格中查找到这个值,则返回一个不同的值。 具体来说,HLOOKUP返回的值与需要查找的值在同一列上,而VLOOKUP返回的值与需要查找的值在同一行上。...数字的话就有点麻烦了,如15是一个数字,但十五则是汉字。函数ISNUMBER判断单元格中的值是否是数字,返回TRUE或FALSE。

    1.7K80

    BC数学函数:PHP处理有关钱数等浮点数计算时高精确度函数库

    在商城类的项目当中,避免不了钱数的计算,也就会出现所谓的浮点数精度问题,前两天阅文的小哥哥面试我的时候就问到了这个,Mysql怎么去存钱数?PHP又该怎么处理浮点数?...在数据库去存这些精确的数值的时候,我们会使用decimal去存储 我们使用PHP对浮点数进行加减乘除计算的时候,有时会遇到一些计算结果错误的问题,比如这样: <?...| 风雪之隅 PHP怎么去确保精确的数值呢?...,测试一下bcmul,2个任意精度数字的乘法计算 var_dump(bcmul('0.58', '100')); 这样就会输出string(2) "58",BC系列函数返回结果为字符串类型,但是结果也是准确的...对于第三个参数:scale,用于设置结果中的小数点后的小数位数 var_dump(bcmul('1.34747474747', '35', 3)); 输出string(6) "47.161",保留3位小数

    1.3K21

    【基础教程】Python算术运算符及用法详解

    (只保留商的整数部分) 7 // 2 3 % 取余,即返回除法的余数 7 % 2 1 ** 幂运算/次方运算,即返回 x 的 y 次方 2 ** 4 16,即 24 接下来将对表 1 中各个算术运算符的用法逐一讲解...("sum1=%d, sum2=%.2f" % (sum1, sum2) ) 运行结果: sum1=107, sum2=22.50 拼接字符串 当+用于数字时表示加法,但是当+用于字符串时,它还有拼接字符串...(str1 * 4) 运行结果: hello hello hello hello / 和 // 除法运算符 Python 支持/和//两个除法运算符,但它们之间是有区别的: /表示普通除法,使用它计算出来的结果和数学中的计算结果相同...在某些编程语言中,除以 0 的结果是无穷大(包括正无穷大和负无穷大)。...换句话说,求余结果的正负和第一个数字没有关系,只由第二个数字决定。 %两边的数字都是整数时,求余的结果也是整数;但是只要有一个数字是小数,求余的结果就是小数。

    84620

    第2章:循环结构程序设计

    顺序结构程序自上到下只执行 一遍,而分支结构中甚至有些语句可能一遍都执行不了。换句话说,为了让计算机执行大量 操作,必须编写大量的语句。能不能只编写少量语句,就让计算机做大量的工作呢?...= 0.3时,就是无限循环.显然,程序中,这种不确定的错误是不应该存在, 在定义循环变量时,尽量采用int型及整数的加减 */ } 程序2-2 输出所有形如aabb的4位完全平方数(即前两位数字相等,...函数floor(x)返回不超过x的最大整数。 程序2-2完整代码 7744问题(1) //输出所有形如aabb的4位完全平方数(即前两位数字相等,后两位数字也相等)。...,直到最后一项小于10−6 本题也是重复计算,因此可以用循环实现。但不同的是,只有算完一 项之后才知道它是否小于10-6。也就是说,循环终止判断是在计算之后,而不是计算之前。...题目说了n=0为输入标记,为什么还要判断scanf的返回值呢?答案是为了鲁棒性(robustness)。 算法竞赛中题目的输入输出是人设计的,难免会出错。

    1.5K10

    小小的 float,藏着大大的学问

    而负数就比较特殊了点,负数在计算机中是以「补码」表示的,所谓的补码就是把正数的二进制全部取反再加 1,比如 -1 的二进制是把数字 1 的二进制取反后再加 1,如下图: ?...既然提到了科学计数法,我再帮大家复习一下,比如有个很大的十进制数 1230000,我们可以也可以表示成 1.23 x 10^6,这种方式就称为科学记数法,该方法在小数点左边只有一个数字,而且把这种整数部分没有前导...在算指数的时候,你可能会有疑问为什么要加上偏移量呢?...1,那就可以不用存起来了,于是就让 23 位尾数只存储小数部分,电路在计算时会自动把这个 1 加上,这样就可以节约 1 位的空间,尾数就能多存一位小数,相应的精度就更高了一点。...所以,你会看到在计算机中 0.1 + 0.2 并不等于完整的 0.3,这主要是因为有的小数无法可以用「完整」的二进制来表示,所以计算机里只能采用近似数的方式来保存,那两个近似数相加,得到的必然也是一个近似数

    1.8K20

    excel常用操作

    5筛选快捷键:ctrl+shift+L在审阅中可以繁简体转化6插入切片器7条件格式数据条8按住ctrl拖拽工作表复制数据 合并计算9添加图标元素加坐标轴标签等10插入图片堆叠,按图片比例显示,堆叠单位是一张图表示的长度添加图表元素在设计中折线迷你图要删除只能在上方工具栏中删除...11数据透视表12每一页都显示标题:在页面布局中打印标题选择顶部标题内容13视图 页面布局调整页首与页尾页码是第几页,页数是总页数插入浮水印颜色用冲蚀效果用回车键移动位置14sum:总和large:第几大的数是输入...,重复的只返回第一个找到的位置,此时可指定开始位置len():单元格内的字母数25hlookup()index():返回指定行列后的元素内容match():返回查询的元素行或列内的位置28randbetween...:在两个数之间产生随机数choose()rand():产生0~1的小数,不会有重复RANK():他能够将数字的排名单独显示在另一列,而且可以去除重名次。...=C3"有"and()or()sumproduct():乘积求和--:将文本转换为数字i33柏拉图,可快速完成34xlookup():在office365中才有

    10910

    初中级前端必须要知道的JS数据类型

    想一个问题为什么引用类型的值要存储到堆内存中?能不能存到栈内存中呢?...null 在 JavaScript 中自成一种原始类型,只有一个值 null,表示无、空、值未知等特殊值。...第一个点表示小数点,第二个才是调用方法。点符号首先会被认为是数字常量的一部分,其次再被认为是属性访问符,如果只写一个点的话,计算机无法知道这个是表示一个小数呢还是去调用函数。...2) // 空格加上点符号调用 Number 类型除了常规数字之外,还包含了一些特殊的数字: NaN:表示不是一个数字,通常是由不合理的计算导致的结果,比如数字除以字符串 1/'a'; NaN 和任何数进行比较都是返回...|| 的操作过程是只有当左边的值返回 false 的时候才会对右边进行求值且将它作为最后结果返回,类似 a?

    1.5K20

    python中round函数的精度保留方法---四舍六入五成双

    参考链接: Python中的精度处理 当我们利用python进行数据计算时,通常会对浮点数保留相应的位数,这时候就会用到round函数,相信各位朋友在进行使用时会遇到各种问题,关于round函数保留精度...这是因为python中对于小数的处理方法造成的。  为了验证python中小数的存储方式,做下面输入:  看到这里,大概清楚了吧?...原来在输入0.1的时候,python内部对应输入的是一个有着多个小数位,的数字!你要是问我具体位数是多少个呢,我会告诉你是55个,那么这个小数究竟是怎么来的呢? ...将小数位扩大10的55次方以后,发现原来当我们输入0.1时候,python内部是这么一大串数字。  3、为什么python中使用round(1.15)会是1.1呢? ...如果说非要进行四舍五入,就要用到decimal模块,进行下面处理以后就可以得到  写在最后:  python中对于小数的处理可以说是非常的谨慎了,所以我们在进行小数点保留问题时,除非特殊需求,否则直接使用

    2.1K00

    数值问题

    数值问题 计算机里面关于数值的处理自有一套体系理论,与现实生活中我们所习惯使用的不太一样。如果对其不了解,在使用计算机的过程中便可能发生一些意想不到的错误。...此函数设想 str1 长时返回 1,否则返回 0;但实际上只有 str1 和 str2 长度相等时会返回 0,其他时候都返回1; 问题就出在函数 strlen() 的返回值是 size_t,即 unsigned...也就是说比较是按照无符号数来比较的,无符号数永远是大于等于 0 的,所以只有两个串儿长度相等时会使左边式子等于 0,其他时候左边结果的机器数中肯定有非 0 位,那么按无符号数解释就会大于0,也就返回1了...为什么移位来实现除法是向下舍入的呢,正数应该很好理解,右移之后丢掉移出的小数部分,数值自然变小了。如果是负数,右移之后丢掉小数部分数值不应该变大吗?...这个数可以在十进制下来理解,比如移动一位也就是一位小数的情况下,-2.1,-2.9都要舍入到 -2,应该怎么操作呢?

    20000

    Python 浮点数精度

    计算机在处理浮点数时会用二进制表示,遇到无法用二进制精确表示的十进制浮点数时便会根据精确度位数进行截断,Python 也不例外。...Python 精度 python 默认使用的是 double 精度, 浮点数在计算机中都是以二进制保存,当有无法精确表示的二进制数字时便会产生截断, 这就导致了在有限精度下,电脑为自己把精度范围外的小数...可以随时在 Python 环境下测试: 0.1+0.2 --> 0.30000000000000004 也就是说,如果你使用很精确的浮点数字计算的结果作为一个逻辑表达式时,可能会发生问题: 0.1...)_2 本质上就是 0.1 左移一位而已,也是 1100 的无限循环小数,在第 53 位被截断 二者变成整数相加后得到 : 100110011001100110011001100110011001100110011001100111000000000...该数据除以 2^{64} 得到 0.1+0.2 的结果,就是 0.30000000000000004 以上流程基本就是 Python 内部计算 0.1+0.2 时的过程,其余语言也一样,这是由无限循环小数难以精确表示导致的

    1.8K40

    二进制那些事

    逻辑右移和算术右移 在介绍完补数后,让我们返回到右移这个话题,右移之后在最高位有补0和补1两种情况。当二进制数的值表示图形模式而非数值时,移位后在最高位补0,这是逻辑右移。...需要注意的是只有在右移时才区分逻辑移位和算术移位。 二进制数表示小数 通过上述介绍,我们对整数的二进制表示方式做了说明。...由于计算机内部所有信息都是以二进制数的形式来处理,因此在这一点上,整数和小数并无差别。不过,使用二进制数表示整数和小数的方法却有很大的不同。...那么,计算机实际上是以什么样的表现形式来处理小数的呢? 目前,计算机提供了单精度浮点数和双精度浮点数来表示小数形式。单精度浮点数用32位表示全体小数,而双精度浮点数用64位表示。...}} 如何避免计算机计算出错 我们知道,无论是用纸面二进制还是浮点数表示小数,都存在计算出错的可能性,那么我们该如何避免这种问题呢?

    77580

    带你学MySQL系列 | 这份MySQL函数大全,真的超有用!

    操作如下: 6)instr(str,要查找的子串):返回子串第一次出现的索引,如果找不到,返回0; 当查找的子串存在于字符串中:返回该子串在字符串中【第一次】出现的索引。...(天花板函数) 天花板函数,在excel,python中均存在这个函数。你就想象一下你家的天花板,把这个数字丢到天花板上,求的是大于等于这个数字的最小整数。...操作如下: 3)floor(x):向下取整,返回的最大整数。(地板函数) 地板函数:在excel,python中均存在这个函数。...()函数和avg()函数:传入整型/小数类型才有意义; 结论如下: sum()函数和avg()函数对于字符串类型、日期/时间类型的计算都没有太大意义。...③ max()函数和min()函数:传入整型/小数类型、日期/时间类型意义较大; 结论如下: max()和min()中传入的是"整型/小数类型",计算的是数值的最大值和最小值。

    1.5K40

    matlab--------矩阵的运算

    用rand函数生成0~1的随机数字 exp(x)是对矩阵的元素进行指数运算; round(x,2)是把全是小数的矩阵的元素保留2位小数; mod(x,3)是计算矩阵元素除以三后的余数; sum函数:求和函数...,如果只有一个返回值,那么会返回较小值,mode(A,2)求每一行的众数;还有一点不同,有缺失值时候,该函数自动忽略,不必使用omitnan参数;[m,n]=mode(A)即返回向量的较小众数m和该数字出现的次数...;如果返回多个众数,需要引入元胞数组的概念,元胞数组就是一组数字,但是可以包含不同的数据类型;大括号索引提取里面的值,C是一个列向量,[M,F,C]=mode(A,2)就会返回每一行的众数; var函数...:varience计算方差,第二个数字,0代表样本,1代表总体方差,总体方差除以n,样本方差除以n-1;对于矩阵,在括号里加上1或2就可以求每一列,每一行的方差。...,只能有一个返回值,但是求每行每列的最值时,可以有两个返回值; 计算每行每列的最值,放在空的向量里面;如果丢失,就会每个元素都和1,2比较 按照规定的维度返回线性索引;

    8010
    领券