`

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

 
阅读更多

自己做了个简单的计算器,很奇怪,大部分时候输入是正确的,但是有的时候输入就不对,比如我输入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位,
可能因此虽然出现上述问题但看不出来
这是计算机硬件结构造成的。
分享到:
评论

相关推荐

    分子量计算器 6.6.0

    + 增加一个独立运行的分子式格式化工具,可以将剪贴板中的文字按一般分子式的要求将数字变成上下标 * 用户指定某种同位素时,可以不指定质量数,程序将根据“使用原子量”选项选用最高丰度的同位素的精确质量或者...

    Melanto计算器「Melanto Calculator」-crx插件

    例如,如果您输入2 + 2,则在您按“ =”之前,您将看到准确的“ 2 + 2”。该工具专为触摸屏而设计,应已准备好用于触摸屏Chromebook。在带键盘的设备上,您可以使用显而易见的键:数字键,点(浮点),+,-,*,/,...

    EXCEL集成工具箱V8.0完整增强版(精简)

    【数字转英文】 将选中区域(默认)或已使用区域存储格的金额数字转换成英文格式显示的表达字符串,为三资企业制作客户外汇付款通知书的理想工具。 【文本转EXCEL】 将文本文件按指定的分隔符号分隔一次性导入到...

    EXCEL集成工具箱V6.0

    【数字转英文】 将选中区域(默认)或已使用区域存储格的金额数字转换成英文格式显示的表达字符串,为三资企业制作客户外汇付款通知书的理想工具。 【文本转EXCEL】 将文本文件按指定的分隔符号分隔一次性导入到...

    会计理论考试题

    C、屏幕显示异常图形 D、机内的电扇不转 2. Windows98支持下面___C__网络协议。 A、Net BEUI B、IPX/SPX C、TCP/IP D、Banyan VINES 3.为了方便人们记忆;阅读和编程,把机器语言进行符号化,相应的语言称为__D__...

    视易神通夜总会5.0安装包

    28.修改了同时对一张预定单进行撤消预定和预定转房出错的问题. 29.修改了同时对一张帐单结帐和点单操作出错的问题. 30.修改了盘点单审核时更新历史盘点单的问题. 视易神通收银系统(夜总会版)V3.0 + SP1 What’s ...

    FD3_0全码全能版

    15.注意:有时FD V1.1在载入继续解码的时候会出错,在弹出的是否继续解码一按是它就提示找到相关的Rand值,进度栏目数字为0,计算里面有数值在动,如下所示: 6 16.结果一般就是提示KI码是错的: 17.如何解决这...

    SuperNotepad

    默认几何计算时使用国际单位弧度,所以计算是要转换一下,如:要计算sin(30°)则应输入sin(30*3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679/180) ...

    傲游浏览器3(Maxthon) 3.1.8.1000 正式版

    * 使用数字键盘快捷键缩放网页时, 状态栏的缩放按钮显示数值不会变化. [收藏] * 在收藏栏中的 "更多收藏" 中, 进行快捷组和文件夹的转换时会有延迟. * 某些情况下收藏栏文件夹的鼠标右键菜单会出现闪烁. [下载] * ...

    grub4dos-V0.4.6a-2017-02-04更新

    执行时可以不用输入扩展名,比如输入test如果当前路径下有一个test.g4b就会自动使用。 2013-10-17 1.修改代码支持新版HOTKEY。 2013-07-10 1.insmod现在支持长文件名(以前最多11个字符,现在没有限制). 2....

    wpe pro英文原版 M2M sniff 修改封包工具

    由于在计算机中数据是以二进制的方式储存的,同时16进制数和二进制间的转换关系十分简单,所以大部分的修改工具在显示计算机中的数据时会显示16进制的代码,而且在你修改时也需要输入16进制的数字。你清楚了吧? ...

    基于hhww改进版的传统五笔输入法(新版支持WIN7)

    用“计算器”将“EE”用二进制查看,共八位每一位分别对应设置中的每一个选项。扩展选项只有第四第八项可以设置。 将04改为00即是Unicode ============================= Space参数就是空格是否强制上屏: 例如:两...

    基于hhww改进版的传统五笔输入法

    用“计算器”将“EE”用二进制查看,共八位每一位分别对应设置中的每一个选项。扩展选项只有第四第八项可以设置。 将04改为00即是Unicode ============================= Space参数就是空格是否强制...

    Visual C++ 2005入门经典--源代码及课后练习答案

    2.4 基本的输入/输出操作 53 2.4.1 从键盘输入 53 2.4.2 到命令行的输出 53 2.4.3 格式化输出 54 2.4.4 转义序列 55 2.5 C++中的计算 57 2.5.1 赋值语句 57 2.5.2 算术运算 58 2.5.3 计算余数 63 ...

    计算机应用技术(实用手册)

    SECURITY OPTION(检测密码方式)如设定为SETUP,则每次打开机器时屏幕均会提示输入口令(普通用户口令或超级用户口令,普通用户无权修改BIOS设置),不知道口令则无法使用机器;如设定为SYSTEM则只有在用户想进入BIOS设置...

Global site tag (gtag.js) - Google Analytics