通过计算时地板未给出预期结果
Floor not giving expected results when passed a calculation
为什么下面的A和B中只有A等于29?使用计算作为 x 参数有什么不同?
#A
floor(x = (1.45/0.05))
#B
floor(x = 29)
> #A
> floor(x = (1.45/0.05))
[1] 28
> #B
> floor(x = 29)
[1] 29
喜欢@bouncyball 表示这是一个浮点数问题。
例如,如果您转到 this link 并输入 1.45 或 0.05,您会注意到它们的二进制表示形式是 "infinitely" 长(即,您不能用二进制的有限字符串编写 1.45) .
因为您的 PC 没有无限的存储空间来存储数字,所以他 "chops" 在某些时候将其关闭 - 这意味着他在他的系统中基本上将您的 1.45 视为 1.49999999999(不要介意 9 的数量)。 0.05 也是如此。
现在你的计算机内部得到了类似 28.9999999999999 的东西——但他输出它的时候并不傻。他知道,28.9999999999 可能应该是 29 - 所以当他输出它时,他只是四舍五入。除非您明确告诉他使用 "floor" 舍入 - 然后他将 28.99999999 舍入为 28.
希望这是有道理的。
为什么下面的A和B中只有A等于29?使用计算作为 x 参数有什么不同?
#A
floor(x = (1.45/0.05))
#B
floor(x = 29)
> #A
> floor(x = (1.45/0.05))
[1] 28
> #B
> floor(x = 29)
[1] 29
喜欢@bouncyball 表示这是一个浮点数问题。
例如,如果您转到 this link 并输入 1.45 或 0.05,您会注意到它们的二进制表示形式是 "infinitely" 长(即,您不能用二进制的有限字符串编写 1.45) .
因为您的 PC 没有无限的存储空间来存储数字,所以他 "chops" 在某些时候将其关闭 - 这意味着他在他的系统中基本上将您的 1.45 视为 1.49999999999(不要介意 9 的数量)。 0.05 也是如此。
现在你的计算机内部得到了类似 28.9999999999999 的东西——但他输出它的时候并不傻。他知道,28.9999999999 可能应该是 29 - 所以当他输出它时,他只是四舍五入。除非您明确告诉他使用 "floor" 舍入 - 然后他将 28.99999999 舍入为 28.
希望这是有道理的。