我正在用一个简单的例子来尝试 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 以更好的方式返回带小数位的数字?
您所需要的只是除法的分母是浮点数,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 中进行除法时,您只需要将除数或除数设为浮点数即可触发浮点运算。
仅使用Fixnum#to_f
一个或将任何值乘以1.0
:
(a*1.0+b)/b
或者
(a.to_f+b)/b
您只需要将除数转换为浮动
<% a = 5 %>
<% b = 4 %>
<%= eval("((a+b)/b.to_f)") %>
无论如何,eval只是评估字符串中的 Ruby 表达式。我认为您的示例中根本不需要它。
<%= (a+b)/b.to_f %>