‘壹’ c++ 浮点数误差
浮点数的概念请看计算机组成原理。也可以看看IEEE754标准。
浮点数的相等问题,只能用两个浮点数的差的绝对值小于某个值来判断。误差无法避免。float的精度大概是小数点后的6位到7位。如果要减少误差可以用double.
‘贰’ 怎么消除浮点运算误差
在进行数据计算时,小数也就是浮点数拥有不低的出场率。在常人看来,机器也就是计算机的数据运算是不会出错的,没错,计算机进行数据运算的确不会犯错,但小数运算的误差是免不了的。
来试一试。
在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表进行求和,然后对结果进行交叉计算。
报告的主体使用类似于所示单元格的公式…
F3:= SUMIFS(表格[值],表格[区域],$ E3,表格[产品],F $ 2)
… SUMIFS使用以下语法:
= SUMIFS(sum_range,criteria_range1,criteria1,criteria_range2,criteria2,...)
该报告的结构良好的版本会将测试添加到行和列的总计中,这些测试可确保报告不会忽略自上次生成报告以来添加到源数据中的新区域或产品。
但不幸的是,Excel的浮点数不准确会导致立足和跨立脚困难。
‘肆’ wpsexcel消除公式浮点运算误差
一是尽可能使用加法而不是使用减法,会很少受浮点运算误差的影响
二是可采用ROUND之类的数据截取,一般这个误差是很小很小的,小数位数在8位以上的,所以,只要四舍五十截取前面几位数,就可以消除这个误差了……
‘伍’ sql语句 decimal(18,0)什么意思
decimal(18,0),数值中共有18位数,其中整数占18位,小数占0位。Decimal(n,m)表示数值中共有n位数,其中整数n-m位,小数m位。
例:decimal(2,1),此时,插入数据“12.3”、“12”等会出现“数据溢出错误”的异常;插入“1.23”或“1.2345...”会自动四舍五入成“1.2”;插入“2”会自动补成“2.0”,以确保2位的有效长度,其中包含1位小数。
当用 int类型会有溢出时,可以用 decimal 类型进行处理,把结果可以用 convert 或是 cast 进行转换。
(5)怎么消除浮点误差sql扩展阅读:
Decimal 数据类型Decimal 变量存储为 96 位(12 个字节)无符号的整型形式,并除以一个 10 的幂数。这个变比因子决定了小数点右面的数字位数,其范围从 0 到 28。变比因子为 0(没有小数位)的情形下,最大的可能值为 +/-79,228,162,514,264,337,593,543,950,335。
在有 28 个小数位的情况下,最大值为 +/-7.9228162514264337593543950335,而最小的非零值为 +/-0.0000000000000000000000000001。注意 此时,Decimal 数据类型只能在 Variant中使用,也就是说,不能声明一变量为 Decimal 的类型。
不过可用 Cdec 函数,创建一个子类型为 Decimal 的 Variant。 这样就对了。Decimal类型消除了发生在各种浮点运算中的舍入误差,并可以准确地表示28个小数位。
‘陆’ VB单精度、双精度浮点数误差,如何消除
浮点数的存在是完全有必要、不可或缺的。电脑由于设计上的特点,它是不可能精确储存一个无限小数(比如说圆周率)的,否则的话一台电脑上的全部内存空间都不够用来储存一个数字!因此,电脑就用浮点数来近似表示一个实数,其中单精度浮点数(Single)占用4个字节,可表示7位有效数字(比如说圆周率用Single型表示就是3.141593),双精度浮点数(Double)占用8个字节,可表示15位有效数字(圆周率的Double型值为3.14159265358979)。正因为它是“近似值”,所以浮点数的运算难免会产生误差,这个是不可避免的,而且这也不是VB的“罪”,在所有程序设计语言中都是存在的(当然,不同的语言可能有不同的规避措施,VB也许在这方面做得不够好)。
货币型(占用8个字节)是一种特殊的数据类型,它看起来像浮点数(因为可带小数),但其实它是定点数(因为它的小数位是固定4位的)。它在运算时会先把自己转换为整数(小数点右移4位),运算后再转为小数(小数点左移4位),所以它的运算是精确运算,不存在浮点误差的问题。但是,由于货币的特殊性,货币型只能有4位小数,因此当小数位超过4位时就不适合用货币型了。
变体型属于“万金油”数据类型,可接受任何数据类型,而且它会自动根据数值的特点自动选择适合的数据类型参与运算,如果数值不含小数,它会自动按整数处理;如果数值所含小数不多于4位,它会按货币型处理(这就是为什么你的程序用变体型不会产生误差的原因);如果小数位大于4,就按浮点数处理(也就是说你的程序处理的数据如果大于4位小数,用变体型一样会产生误差的)。但是,变体型属于VB的“畸形产物”(其他高级语言中是没有这样的类型的),除了刚入门的初学者,一般不建议使用变体型。因为变体型为了适应各种数据类型,它要占用16个字节的内存空间(也就是说一个变体型变量即使值为0,它也要占用16个字节),这会严重浪费宝贵的系统资源,严重影响程序的运行效率,而且有可能会产生一些意料之外的错误(这里就不赘述了)。所以,千万不要以为变体型简单、好用,一个程序中如果大量使用变体型变量,那么可以肯定的是,这个程序会显得非常业余,一点也不专业!
综上所述,使用浮点数并不是因为它“准确”,而是当你处理的数据含有小数(尤其是大于4位的小数)时,你只能选择浮点数来计算了,别无选择!其次,浮点运算误差是不可避免的,只能通过其他措施尽量减小误差的影响。此外,变体型并不是一种独立的数据类型,它会根据需要自动转为整数、货币型、浮点数等,所以所谓“变体型不如单双精度准确”之类的提法也是错误的。
‘柒’ js浮点数精度误差问题,解决方法
JavaScript 是一门弱类型的语言,从设计思想上就没有对浮点数有个严格的数据类型,所以精度误差的问题就显得格外突出。下面就分析下为什么会有这个精度误差,以及怎样修复这个误差。
首先,我们要站在计算机的角度思考 0.1 + 0.2 这个看似小儿科的问题。我们知道,能被计算机读懂的是二进制,而不是十进制,所以我们先把 0.1 和 0.2 转换成二进制看看:
0.1 => 0.0001 1001 1001 1001…(无限循环)
0.2 => 0.0011 0011 0011 0011…(无限循环)
双精度浮点数的小数部分最多支持 52 位,所以两者相加之后得到这么一串 0. 因浮点数小数位的限制而截断的二进制数字,这时候,我们再把它转换为十进制,就成了 0.30000000000000004。
原来如此,那怎么解决这个问题呢?我想要的结果就是 0.1 + 0.2 === 0.3 啊!!!
有种最简单的解决方案,就是给出明确的精度要求,在返回值的过程中,计算机会自动四舍五入,比如:
var numA = 0.1;
var numB = 0.2;
alert( parseFloat((numA + numB).toFixed(2)) === 0.3 );
乘法运算中有这种,比如0.58*100,结果是57.99999999999999。可以用Math.round()进行处理,
------||-------
尽量避免对小数进行操作,先处理成整数后在进行操作,其结果会比较精确。
‘捌’ 浮点数运算,因编译器精度不同导致的误差如何避免
将小数部分放大10倍
‘玖’ 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()函数将其保留固定的小数位。
方法二:
工具----选项----重新计算---勾选【以显示精度为准】
‘拾’ 表格浮点误差怎么解决
在Excel进行计算时在计算机中是转换成二进制进算然后保留数值的,所以会出现误差。解决方法:1、打开excel表格,在单元格A1中输入数字“2.88”,在单元格B1中输入数字“5.89”。2、在C1单元格中输入计算公式:=(ROUND(A1,2))+ROUND(B1,2),意思为使用ROUND函数确保小数位为2位。3、点击回车生成函数公式计算结果,得到的数值为“8.77”。4、复制C1单元格,在C2点击右键,选择“粘贴数值”。5、粘贴之后,可以看到计算得到的数值是小数点显示后两位,没有出现误差。