为什么浮点数的余数除以一个比它本身更大的整数 returns 浮点数本身?
Why the remainder of a float divided by a bigger integer than itself returns the float itself?
我对编程概念完全陌生我正在学习 ruby 目前!
我玩了一下 irb
,看到一个浮点数除以一个比它本身大的整数的余数 return 浮点数本身。
例如 2.5 % 5
returned 2.5
.
我期望上述等式的结果是 0
因为如果我们将 2.5
除以 5
答案将是 0.5
余数 0
.
你能帮我理解为什么会这样吗,或者我在数学上是错误的吗?
提前致谢
% - 是模运算符
(在计算中,模运算求一个数除以另一个数后的余数(称为运算的模数)
在您的情况下,这是正确的:
2.5% 5 = 2.5
/ - 是除法
2.5 / 5 = 0.5
只要您将一个数字包含为浮点数,在本例中为 2.5,即使另一个数字是字符串,Ruby 也会自动将结果转换为浮点数。
希望对您有所帮助,
奥古斯塔斯
你在数学上是错误的:2.5
除以 5
是 而不是 5
。即0.5
。或者,如果您谈论的是 "integer division"(即结果始终为整数的除法),则结果为 0
。 0 * 2.5
是 0
,因此,余数是 2.5
.
实际上,对于 任何 对数字 a
和 b
都是如此,其中 b > a
即 a % b == a
。
Numeric#% 的文档指出:“x.modulo(y)
表示 x-y*(x/y).floor
”。在您的示例中,这意味着:
2.5 % 5
#=> 2.5 - 5*(2.5/5).floor
#=> 2.5 - 5*(0.5.floor) => 2.5 - 5 * 0 => 0.5
再考虑四个例子。
9 % 2.0
#=> 9 - 2.0*(9/2.0).floor
#=> 9 - 2.0*(4.5.floor) => 9 - 2.0*4 => 1.0
9.0 % 2
#=> 9.0 - 2*(9.0/2).floor
#=> 9.0 - 2*(4.5.floor) => 9.0 - 2.0*4 => 1.0
9.0 % 2.0
#=> 9.0 - 2.0*(9.0/2.0).floor
#=> 9.0 - 2.0*(4.5.floor) => 9.0 - 2.0*4 => 1.0
9 % 2
#=> 9 - 2*(9/2).floor
#=> 9 - 2*(4.floor) => 9 - 2*4 => 1
Float#%(又名 Float#modulo
)的文档给出了另外两个示例:
6543.21 % 137
#=> 6543.21 - 137*((6543.21/137).floor)
#=> 6543.21 - 137*(47.76065693430657.floor)
#=> 6543.21 - 137*47
#=> 104.21000000000004
6543.21 % 137.24
#=> 6543.21 - 137.24*((6543.21/137.24).floor)
#=> 6543.21 - 137.24*(47.67713494607986.floor)
#=> 6543.21 - 137.24*47
#=> 92.92999999999961
我对编程概念完全陌生我正在学习 ruby 目前!
我玩了一下 irb
,看到一个浮点数除以一个比它本身大的整数的余数 return 浮点数本身。
例如 2.5 % 5
returned 2.5
.
我期望上述等式的结果是 0
因为如果我们将 2.5
除以 5
答案将是 0.5
余数 0
.
你能帮我理解为什么会这样吗,或者我在数学上是错误的吗? 提前致谢
% - 是模运算符 (在计算中,模运算求一个数除以另一个数后的余数(称为运算的模数) 在您的情况下,这是正确的: 2.5% 5 = 2.5
/ - 是除法 2.5 / 5 = 0.5
只要您将一个数字包含为浮点数,在本例中为 2.5,即使另一个数字是字符串,Ruby 也会自动将结果转换为浮点数。
希望对您有所帮助, 奥古斯塔斯
你在数学上是错误的:2.5
除以 5
是 而不是 5
。即0.5
。或者,如果您谈论的是 "integer division"(即结果始终为整数的除法),则结果为 0
。 0 * 2.5
是 0
,因此,余数是 2.5
.
实际上,对于 任何 对数字 a
和 b
都是如此,其中 b > a
即 a % b == a
。
Numeric#% 的文档指出:“x.modulo(y)
表示 x-y*(x/y).floor
”。在您的示例中,这意味着:
2.5 % 5
#=> 2.5 - 5*(2.5/5).floor
#=> 2.5 - 5*(0.5.floor) => 2.5 - 5 * 0 => 0.5
再考虑四个例子。
9 % 2.0
#=> 9 - 2.0*(9/2.0).floor
#=> 9 - 2.0*(4.5.floor) => 9 - 2.0*4 => 1.0
9.0 % 2
#=> 9.0 - 2*(9.0/2).floor
#=> 9.0 - 2*(4.5.floor) => 9.0 - 2.0*4 => 1.0
9.0 % 2.0
#=> 9.0 - 2.0*(9.0/2.0).floor
#=> 9.0 - 2.0*(4.5.floor) => 9.0 - 2.0*4 => 1.0
9 % 2
#=> 9 - 2*(9/2).floor
#=> 9 - 2*(4.floor) => 9 - 2*4 => 1
Float#%(又名 Float#modulo
)的文档给出了另外两个示例:
6543.21 % 137
#=> 6543.21 - 137*((6543.21/137).floor)
#=> 6543.21 - 137*(47.76065693430657.floor)
#=> 6543.21 - 137*47
#=> 104.21000000000004
6543.21 % 137.24
#=> 6543.21 - 137.24*((6543.21/137.24).floor)
#=> 6543.21 - 137.24*(47.67713494607986.floor)
#=> 6543.21 - 137.24*47
#=> 92.92999999999961