当前位置:首页 » 办公资讯 » 怎样清楚excel的浮点误差

怎样清楚excel的浮点误差

发布时间: 2023-01-28 20:26:34

‘壹’ excel如何消除缩位后的计算误差

有时我们输入的数字是小数点后两位数,但是在精度要求上只要一位,缩位后显示没问题,但其计算结果却是有误差的。解决方法是:单击“工具→选项→重新计算”,选中“以显示值为准”(),这样计算结果就没有误差了。
事实上并不是计算上有误差,而是显示设置的四舍五入。采用本技巧提供的方法,可以解决显示中的问题,但同时会改变数值的精度,在使用前Excel会给你一个警告。

‘贰’ Excel 求教:单精度浮点型与双精度浮点型的问题

求教,今天学习突然发现个问题,同样的代码,一个申明变量为单精度浮点型,一个申明变量为双精度浮点型,但是结果却不一样

a=3.11999988555908

b=3.12

代码:

Sub test2()

Const a As Single = 3.12

Const b As Double = 3.12

Range("A1") = a

Range("B1") = b

End Sub

结果在excel中如图

这样的话定义单精度浮点型不是没用,以后小数不是都要定义为双精度浮点型了吗?

浮点数的误差是一定存在,并且无法消除。

永远不要直接比较两个浮点数。比较的时候要先round。

把电脑中的浮点运算误差找出来 - 任何人的电脑都会有这个误差的

很多人在日常使用Excel,可能都没有注意到浮点小数带来的计算误差问题

因为日常使用的运算结果,肯定都是四舍五入之后的结果,可以排除浮点误差的影响

但是,浮点小数的误差,也会出现在运算的过程,有可能导致最终结果出错。

比方说 countif(A1:A10000,"=B1")这样的简单统计,也有可能出错。

附件生成5万个随机小数(四舍五入到2位小数位),加上然后马上减去同一个整数

对比计算前后的数值是否相等(数学上当然是绝对相等的,但是电脑的运算结果就不一定了。。。。。。)

附件会自动找出一批在你的电脑上会出现浮点小数误差导致错误的运算。

出现浮点小数运算误差的原因很简单,小数有无穷多个

甚至一个小数也有无穷多位,如十进制的1/3,或者二进制的0.1

所以计算机存储小数的时候,必定只能存储所有小数的一部分,而无穷小数则必须截断

因此,一个小数有时候就只能取一个接近值而不是精确值

而对应的浮点数运算,也只能得到接近值,而不是精确值

不同的CPU,比方说Intel的跟AMD的,或者奔腾跟赛扬,在硬件上对于截断的位置是不一样的

所以,同一个运算在不同的机器就可能有不同的结果

这也是为什么论坛经常有人说xx运算不正确,然后回帖的人说我的机器没事,其实就是CPU不同而已

另一方面,不同的软件,内部计算的时候,也许用了不同的CPU硬件实现的数据类型,或者精度设置也不一样,

所以,同一个运算在不同的软件也可能有不同的结果

编程,写公式要注意,假设 x,y 都是浮点数,er。。。。。。excel的每个小数单元格都是浮点数

那么永远不要写 if x=y 这样的句子,因为很可能数学上相等的x和y,在计算机内部是不等的

应该写成 if |x-y| / max(|x|,|y|) <= 0.0000000000001 之类

或者简单一点,用if round(x) = round(y) 来判断,这样最末一位的尾数浮点存储误差就不会影响整个数值了。

幸运的是,整数和定点小数不会受影响,编程时应该优先考虑使用整数和定点小数类型

另一方面,即使浮点小数可以完全表示我们要计算的数值,但是计算结果却也有可能产生误差

浮点,定点的意思是指小数点的位置

定点小数:小数点位置固定。

以十进制为例,假设一个数值类型可以有6个十进制位置,那么定点类型无须记录小数点位置,可以有以下类型:

整数类型,小数点位置就一定是个位后面,能够表达的最精确数字就是1,能够表达的范围是 000000 - 999999

两位小数类型,小数点位置就一定是百分位,能够表达的最精确数字就是0.01,,能够表达的范围是 0000.00 - 9999.99
。。。。。。等等

浮点小数:小数点位置可以变动,并且需要额外的记录去描述这个变动的小数点位置。

假设这里把其中一个位置用于记录小数点位置(可变范围 0-9),并且规定:

小数点位置取5,表示精度是1,小数点在个位后面,这个数值类型有0个小数位,可以表示 00000 到 99999 的数 (注意:这里只有5位有效数字)

小数点位置取6,表示精度是 0.1,小数点在十分位后面,这个数值类型有1个小数位,可以表示 0000.0 到 9999.9 的数

小数点位置取9,表示精度是 0.0001,小数点在万分位后面,这个数值类型有4个小数位,可以表示 0.0000 到 9.9999 的数
......
小数点位置取4,表示精度是 10,表示小数点在十位,这个数值类型可以表示 00000 x 10 到 999990 的数,精度是 10
......
小数点位置取0,表示精度是 100000,表示小数点在十万位,这个数值类型可以表示 00000 x 100000 到 9999900000 的数,精度是 100000

可见浮点小数通过可变的小数位置,使一个数值类型可以用一部分表示有效数字,另一部分表述每一单位有效数字的倍率

从而灵活地表示很大范围的数值,代价是:由于用了一部分记录内容去记录小数点位置,所以有效数字的长度比定点小数要低。

而且,一些定点数运算不会出现的问题,在浮点数运算会出现

如两个数相加
如果第一个浮点数是 100.01,第二个浮点数是 9999900000

按上述规则,这两个都是合法的浮点数,可是它们的和 99999000100.01 却无法用同一个浮点数类型表示出来。

一般计算机碰到这种情况,就会自动按比较大的数值来四舍五入,于是

100.01 + 9999900000 = 9999900000 (出现了100.01的误差)

这也是浮点数误差产生的一个原因:小的数值被大的数值“吸收”了。

要在Excel证明这一点就太简单了,因为excel的double类型浮点小数只有15个有效数字(即最多记录15个十进制数字)

所以Excel的单元格运算 12345012345678900000 + 12345.0123456789 = 12345012345678900000

-----------------------------------------------------------

VBA单精度浮点型Single与双精度浮点型Double的区别

浮点型说白了就是科学记数法

单精度浮点型(single)

在C++中,单精度浮点型(float )专指占用32位存储空间的单精度(single-precision )值。单精度在一些处理器上比双精度更快而且只占用双精度一半的空间,但是当值很大或很小的时候,它将变得不精确。当你需要小数部分并且对精度的要求不高时,单精度浮点型的变量是有用的。例如,当表示美元和分时,单精度浮点型是有用的。

在foxpro中,单精度浮点型是为了提供兼容性,浮点数据类型在功能上等价于数值型。

在VB中,Single 数据类型 Single(单精度浮点型)变量存储为 IEEE 32 位(4 个字节)浮点数值的形式,它的范围在负数的时候是从 -3.402823E38 到 -1.401298E-45,而在正数的时候是从 1.401298E-45 到 3.402823E38。6位有效位数

Single 的类型声明字符为感叹号 (!)。

双精度(double)型

C语言中,双精度(double)型占8 个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。

Single 最多可以显示小数点后面7位 Double 最多可以显示小数点后面14位

Single 数据类型
Single(单精度浮点型)变量存储为 IEEE 32 位(4 个字节)浮点数值的形式,它的范围在负数的时候是从 -3.402823E38 到 -1.401298E-45,而在正数的时候是从 1.401298E-45 到 3.402823E38。Single 的类型声明字符为感叹号(!)。

Double 数据类型
Double(双精度浮点型)变量存储为 IEEE 64 位(8 个字节)浮点数值的形式,它的范围在负数的时候是从 -1.79769313486232E308 到 -4.94065645841247E-324,而正数的时候是从 4.94065645841247E-324 到 1.79769313486232E308。Double 的类型声明字符是数字符号(#)。

‘叁’ excel浮点运算误差是怎么回事麻烦帮忙解决下

将计算设置成
按显示精度计算即可
不知道你什么版本excel
不同版本设置位置不一样

‘肆’ 怎么消除浮点运算误差

在进行数据计算时,小数也就是浮点数拥有不低的出场率。在常人看来,机器也就是计算机的数据运算是不会出错的,没错,计算机进行数据运算的确不会犯错,但小数运算的误差是免不了的。

来试一试。

在JS中写上console.log(0.3-0.1);输出到控制台

0.3与0.1转换为二进制的浮点数都是无限循环小数。但由于浮点数精度有限被强行截断,所以转回十进制输出的数据会有误差。

那么如何解决这个问题。

最简单的解决方案就是给出明确的精度要求,在返回值的过程中,计算机会自动四舍五入。

console.log((0.3-0.1).toFixed(2));//输出的结果是0.20;

然而这样子解决有点勉强。

再看下面的方法

var s = Math.pow(10,8);

console.log((0.3 * s - 0.1 * s)/s);

输出后结果为0.2,没有误差。为什么,上面是什么意思。

原来为了避免产生精度差异,我们要把需要计算的数字乘以 10 的 n 次幂,换算成计算机能够精确识别的整数,然后再除以 10 的 n 次幂,就能够得到准确的结果了。

大部分编程语言都是这样处理精度差异的,这里就借用过来处理一下 JS 中的浮点数精度误差。

‘伍’ 请教下,如何解决excel数据透视表中出现的浮点误差原因导致的数值显示错误问题。

工具,选项,重新计算,“以显示精度为准”

‘陆’ Excel 怎么去除EXCEL中的浮点误差-Excel学习网

乍看之下,以下报告是一份普通报告。它仅按产品和地区对Excel表进行求和,然后对结果进行交叉计算。

报告的主体使用类似于所示单元格的公式…

F3:= SUMIFS(表格[值],表格[区域],$ E3,表格[产品],F $ 2)

… SUMIFS使用以下语法:

= SUMIFS(sum_range,criteria_range1,criteria1,criteria_range2,criteria2,...)

该报告的结构良好的版本会将测试添加到行和列的总计中,这些测试可确保报告不会忽略自上次生成报告以来添加到源数据中的新区域或产品。

但不幸的是,Excel的浮点数不准确会导致立足和跨立脚困难。

‘柒’ EXCEL计算有误是怎么回事后面有那么多小数点,数字是我手敲进去的

EXCEL中小数运算存在浮点误差,这个与小数的存储方式有关,是无法避免的。
并不是因为中间过程与手动输入数据的关系,只是是小数运算就可能存在这种误差,整数运算就不会有。
必要时,可以用显示格式,设置小数位数,或者用ROUND函数四舍五入来修正。

‘捌’ wpsexcel消除公式浮点运算误差

一是尽可能使用加法而不是使用减法,会很少受浮点运算误差的影响
二是可采用ROUND之类的数据截取,一般这个误差是很小很小的,小数位数在8位以上的,所以,只要四舍五十截取前面几位数,就可以消除这个误差了……

‘玖’ Excel 求教用VBA解决浮点误差

原因:这是由于浮点运算造成的。(在微软官方有详细说明的)

(0.65)10 = (0.......)2(0.6) 10 = (0.......)2

目前计算机上存储浮点数值是按照IEEE(电气和电子工程师协会)754浮点存储格式标准来存储的。IEEE单精度浮点格式共32位,包含三个构成字段:23位小数f,8位偏置指数e,1位符号s。将这些字段连续存放在一个32位字里,并对其进行编码。其中0:22位包含23位的小数f; 23:30位包含8位指数e;第31位包含符号s。也就是说上面将0.65及0.5转换出的二进制代码,我们只能存储23位,即使数据类型为double,也只能存储52位,这样大家便能看出问题出现的原因了。

截取的二进制代码已无法正确表示0.65及0.5,根据这个二进制代码肯定无法正确得到结果0.05。

在Excel进行计算时在计算机中是转换成二进制进算然后保留数值的,所以会出现误差。

方法一:

将原公式利用round()函数将其保留固定的小数位。

方法二:

工具----选项----重新计算---勾选【以显示精度为准】

热点内容
马路上汽车的噪音在多少分贝 发布:2023-08-31 22:08:23 浏览:1949
应孕棒多少钱一盒 发布:2023-08-31 22:08:21 浏览:1421
标准养老金一年能领多少钱 发布:2023-08-31 22:05:05 浏览:1701
湖北通城接网线多少钱一个月 发布:2023-08-31 21:59:51 浏览:1785
开随车吊车多少钱一个月 发布:2023-08-31 21:55:06 浏览:1545
京东付尾款怎么知道前多少名 发布:2023-08-31 21:52:58 浏览:1873
在学校租铺面一个月要多少钱 发布:2023-08-31 21:52:09 浏览:2007
2寸有多少厘米 发布:2023-08-31 21:50:34 浏览:1653
知道电压如何算一小时多少电 发布:2023-08-31 21:46:20 浏览:1632
金手镯54号圈周长是多少厘米 发布:2023-08-31 21:44:28 浏览:1807