在最近的编程过程中遇到一个小问题:
> floor(29/50*50) [1] 28 > floor(29*50/50) [1] 29 |
也许你看到这个的第一反应是,这应该是一个浮点数问题。但是如何解释这个问题呢?也许你并没有一个清晰的答案(我也是)。
于是询问他人。询问之下得到了如下的答案(感谢Steven McKinney):
> options(digits = 22) > 29/50 [1] 0.579999999999999960032 > 29/50 * 50 [1] 28.99999999999999644729 > 29*50/50 [1] 29.00000000000000000000 > .58 * 50 [1] 28.99999999999999644729 > floor(28.999999) [1] 28.00000000000000000000 > floor(29.000000) [1] 29.00000000000000000000 |
看到这个答案,你是不是很吃惊,怎么0.58*50运算出来居然会是一个不是29的浮点数?我们需要先了解一下计算机是如何保存浮点数的。接下来,我们来看一看.58这个数据在计算机中是如何保存的,
来到网站:http://www.h-schmidt.net/FloatConverter/
将.58输入到Decimal representation栏中,你就会看到它经过编译后在计算机里保存的精度。
从上图中,我们就可以看出,0.58在计算机中,实际是被保存为0.5799999833106995的。
比如这样的
sqrt(2) ^ 2 == 2
是会报false的~~~师弟啊。交换一下友情链接吧?
世界的学大汉武立国