[转]计算器输入的数字有时显示不对

自己做了个简单的计算器,很奇怪,大部分时候输入是正确的,但是有的时候输入就不对,比如我输入1.89就会显示1.8900000000000001,但是我输入1.86就显示很正常,不知道是怎么回事,是数据类型定义的不对吗?拜托大家帮我看下~非常感谢~(计算器8-16VS9-cs4.fla  是CS4文件   计算器8-16VS9.fla是cs5
 
 
 
 
 
1.8900000000000001
一般是浮点数精度问题造成的。
这个无法难以解决。

缓解的办法略提一下
设原始数字是og,
首先将其分为符号a、整数b和小数c以方便处理,此处只分两段或者不分段也可,分成三段比较清晰。
var a:Number = og>=0?1:-1;
og = Math.abs(og);
var b:Number = Math.floor(og);
var c:Number = og-b;
将c放大若干倍后四舍五入,作用是舍弃后面部分的小数。
c = Math.round(c*1000000)/1000000;//保留6位小数
还原og
og = a*(b+c);
注意!og仍然能是不准的数字!双精度浮点数最多精到15~16位,而b+c的有效数字位数有可能达到或超过16位

上述我们做的意义在于可以用字符串显示正确的数字。实际参与运算的其实还是og
var 显示:String;
a>=0?显示="":显示="-";
显示+=b.toString();
if(c>=1){
c-=1; b+=1;//避免c是0.9999999999被舍入为1的情况。
}
显示+=c.toString().subString(1);//去掉0
 
 
 
 
 
 
回复 2# General_Clarke 
不是吧……就算是精度……为什么1.8900000000000001
后面会多个1呢?
o(>﹏<)o
 
 
 
 
 
确定是精度问题。
后面的1是因为浮点数运算不准造成的。
与计算机硬件有关。
 
 
 
 
 
很早之前,用C++做过类似的计算器,但是没有问题的啊~~~是因为数据定义为Number造成的?
 
 
 
 
 
 
即使是C++的计算器也有同样的问题。
lz使用C++反复算几次小数加减乘除法,同样可能出现0.999999999999999或者1.000000000001
不过C++的cout没有记错的话对小数是自动舍入,只保留6位,
可能因此虽然出现上述问题但看不出来
这是计算机硬件结构造成的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值