如何使eval返回带小数位的数字?

时间:2012-04-28 12:23:20

标签: ruby eval

我正在尝试使用一个简单示例的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以更好的方式返回带小数位的数字?

3 个答案:

答案 0 :(得分: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中进行除法时,您需要将dividend 除数设置为float来触发浮点运算。

答案 1 :(得分:1)

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

(a*1.0+b)/b

(a.to_f+b)/b

答案 2 :(得分:1)

您只需要将除数转换为像

一样浮点数
<% a = 5 %>
<% b = 4 %>
<%= eval("((a+b)/b.to_f)") %>

无论如何, eval 只是在字符串中计算Ruby表达式。我认为你根本不需要它。

<%= (a+b)/b.to_f %>