java,js中小数计算精度误差问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

java,js中⼩数计算精度误差问题
在碰见这个问题之前我完全没有这个概念,碰见了特此记录;
项⽬js⾥⾯中⽤到了number*0.2(其中number是⼀个整数,我测试的时候是259),得到的结果却是51.80000000000000004这么个结果,
当时直接蒙逼,根本不知道什么原因,随⼿在java中写了⼀个System.out.println(259*0.2),得到⼀样的结果;
 这个时候觉得就不是数据类型的问题了,上⽹围观⼤神给出的原因
---------------------------------------------------------------------------------------------------------------------------------------------------
⽹上有这样⼀个问题:0.1+0.2在计算机中的结果
不论java,javascript,python中的结果都是0.30000000000000004
计算机中存储的都是⼆进制的0和1,⽽我们现实中的数存⼊计算机中转换为⼆进制时有可能不能整除,
也就是不能正好整除,所以⽤⼆进制表⽰现实中的数并计算就产⽣了误差。

把⼗进制的0.1和0.2转换为⼆进制:
0.1 => 0.0001 1001 1001 1001…(1001⽆限循环)
0.2 => 0.0011 0011 0011 0011…(0011⽆限循环)
但是我们计算机的硬件存储的位数是有限制的不可能⽆限循环下去,⼀般双精度浮点数总共占⽤64位,、
其中最多53位为有效精度数字(包括符号位),所以存储时:
0.1=>0.0001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001
0.2=>0.0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011
0.1+0.2=>0.0100 1100 1100 1100 1100 1100 11001 100 1100 1100 1100 1100 1100
转换为⼗进制就是:0.30000000000000004。

相关文档
最新文档