1

我正在用一个简单的例子来尝试 eval 函数:

<% a = 5 %>
<% b = 4 %>
<%= eval("((a+b)/b)") %>

我希望结果为 2.25,但上面给出 2。下面的代码给出 2.25 但不是很优雅

<% a = 5 %>
<% b = 4 %>
<%= eval("((a.to_f+b.to_f)/b.to_f)") %>

如何让 eval 以更好的方式返回带小数位的数字?

4

3 回答 3

5

您所需要的只是除法的分母是浮点数,Ruby 会理解在表达式上使用浮点运算而不是默认的整数运算:

irb(main):001:0> a = 5
irb(main):002:0> b = 4
irb(main):003:0> a / b
=> 1
irb(main):004:0> a / b.to_f
=> 1.25
irb(main):005:0> (a + b) / b.to_f
=> 2.25

编辑

进一步澄清 - 它实际上与本身无关eval。这正是 Ruby(和大多数其他语言)处理算术表达式的方式。默认情况下,大多数表达式都是使用整数算术完成的。

在 Ruby 中进行除法时,您只需要将除数除数设为浮点数即可触发浮点运算。

于 2012-04-28T12:31:43.127 回答
1

仅使用Fixnum#to_f一个或将任何值乘以1.0

(a*1.0+b)/b

或者

(a.to_f+b)/b
于 2012-04-28T12:32:09.053 回答
1

您只需要将除数转换为浮动

<% a = 5 %>
<% b = 4 %>
<%= eval("((a+b)/b.to_f)") %>

无论如何,eval只是评估字符串中的 Ruby 表达式。我认为您的示例中根本不需要它。

<%= (a+b)/b.to_f %>
于 2012-04-28T12:33:00.960 回答