栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么多次添加0.1仍然无损?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么多次添加0.1仍然无损?

舍入误差不是随机的,并且它的实现方式会尝试使误差最小化。这意味着有时错误是不可见的,或者没有错误。

例如

0.1
是不完全
0.1
,即
new BigDecimal("0.1") < newBigDecimal(0.1)
,但
0.5
也正是
1.0/2

该程序向您显示所涉及的真实价值。

BigDecimal _0_1 = new BigDecimal(0.1);BigDecimal x = _0_1;for(int i = 1; i <= 10; i ++) {    System.out.println(i+" x 0.1 is "+x+", as double "+x.doublevalue());    x = x.add(_0_1);}

版画

0.1000000000000000055511151231257827021181583404541015625, as double 0.10.2000000000000000111022302462515654042363166809082031250, as double 0.20.3000000000000000166533453693773481063544750213623046875, as double 0.300000000000000040.4000000000000000222044604925031308084726333618164062500, as double 0.40.5000000000000000277555756156289135105907917022705078125, as double 0.50.6000000000000000333066907387546962127089500427246093750, as double 0.60000000000000010.7000000000000000388578058618804789148271083831787109375, as double 0.70000000000000010.8000000000000000444089209850062616169452667236328125000, as double 0.80.9000000000000000499600361081320443190634250640869140625, as double 0.91.0000000000000000555111512312578270211815834045410156250, as double 1.0

注意:这

0.3
略有偏离,但是当您到达
0.4
位时,必须将其下移一位以适应53位的限制,并且错误将被丢弃。再次,一个错误蠕变回来为
0.6
0.7
,但对于
0.8
1.0
错误被丢弃。

将其添加5次应该累积错误,而不是取消错误。

出现错误的原因是由于精度有限。即53位。这意味着随着数字变大,数字将使用更多的比特,比特必须从末尾丢弃。这会导致舍入,这种情况下对您有利。
当获得较小的数字(例如

0.1-0.0999
=>)时,您会得到相反的效果,
1.0000000000000286E-4
并且看到的错误比以前更多。

一个这样的例子就是为什么在Java6中Math.round(0.49999999999999994)为什么返回1的原因,在这种情况下,计算中的一点损失会导致答案有很大的不同。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/486135.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号