前两天在看PHP的时候看到一本书中提到在由浮点型转换成整形的时候需要注意,因为由于计算机存储的问题会导致某些出人意料的结果。我突然想起来在原来看Java 的时候也有相同的问题,但是以前没有仔细想。既然这里也提到了,就应该好好总结下。以下是我用的例子:
在PHP/Java/C++/C#下我都尝试着运行了下面计算的结果:
(int)(0.1*10) (int)((0.1+0.7)*10) (int)((0.1+0.9)*10)
结果得到的结果都是:1 7 10
对于这个答案我也只能解释第二个的答案,因为在计算机的内部,所有的信息都是以二进制存储的,所以在计算机中不能精确的表示0.1,而只能表示成0.099999....。所以0.1+0.7等于0.799999....,乘以10就是7.999999....,而去整就是截取小数点后的字段,所以得到的答案是7。但是如果以这个理由来解释第一和第三个就又解释不清楚了。
这个问题问了好些人,也没有给出具体的答案。我估计要彻底理解这个问题,需要从计算机的运算原理入手。其实能否正确理解这个问题的原理并不重要,只要我们知道有这种事情,在编程的时候小心些就好了。尽量避免这种运算,就像永远不要比较浮点数是否相等的道理一样。
分享到:
相关推荐
浮点数与整形数据互转软件,支持单精度、双精度等格式。
关于浮点数的精度问题,对于了解和学习C语言有一定帮助
目前支持二进制浮点数的硬件和软件文档中,几乎都声称其浮点数实现符合IEEE 754标准。那么,什么是IEEE 754标准? 最权威的解释是IEEE754标准本身ANSI/IEEE Std 754-1985《IEEE Standard for Binary Floating-Point...
单片机在通信中,浮点数的处理往往容易出错,本代码解决单片机通信时的浮点数据转换处理,包括浮点数转换成char ,和char转成float类型
二进制浮点数舍入问题解决
浮点数整数转换工具,用于浮点数与整数之间相互转换
MODBUS RTU协议中浮点数的相互转换 从浮点数到整形,以及从整形到浮点数 带简单的协议说明文档
单片机浮点数设计 单片机浮点数设计 单片机浮点数设计
单精度浮点数,双精度浮点数,浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。
C语言中浮点数精度问题分析.pdf
该代码可以实现单精度浮点数和16进制字符之间的转换,包含源代码
因此,单片机的C程序,在发送或接收外围设各的参数值时,需要解决如何实现浮点数与IEEE格式转换的问题。 2.IEEE浮点数的格式 在计算机中,浮点数的存储均采用4字节的IEEE-754格式。例如,浮点数50.0的IEEE表示形式...
labview下实现16进制转换浮点数。
解决JS浮点数(小数)计算加减乘除的BUG
C语言浮点数转字符串
本文档简介了TMS320C3x浮点数简介、IEEE754的32位转VC33的32位浮点数算法、IEEE754的64位浮点数转VC33的40位浮点数算法;给相关TI的DSP开发工程师提供开发参考。
labview浮点数读取,可以通过modbus通信直接读写浮点数。
好用的浮点数与二进制转换工具,通讯开发必备实用小工具,4字节浮点数转换,支持正序倒序转换。浮点数转二进制,二进制转浮点数,转换准确。
本文将回避关于浮点数枯燥的数值计算理论,基于 Java 平台的浮点数支持(当然,也适用于其它绝大部分编程语言),尽可能深入浅出的介绍浮点数的基本知识,和常见问题产生的原因。最后介绍浮点加法。
S7-200SMART 64位浮点数转32位浮点数(源文件+库文件+程序注释),double to float