R为什么认为它们不相等 3

在最近的编程过程中遇到一个小问题:

> 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栏中,你就会看到它经过编译后在计算机里保存的精度。
Screen Shot 2013-12-20 at 10.34.45 AM
从上图中,我们就可以看出,0.58在计算机中,实际是被保存为0.5799999833106995的。

3 thoughts on “R为什么认为它们不相等

  1. Reply Puriney 12月 30,2013 11:50 上午

    比如这样的
    sqrt(2) ^ 2 == 2 是会报false的~~~

  2. Reply Puriney 12月 30,2013 5:55 下午

    世界的学大汉武立国

Leave a Reply

  

  

  

%d 博主赞过: