问题描述
我不老长生不老药,在这种情况下,我试图对接收到的数据执行数学运算,计算从用户那里获得的工资的十分之一,并抛出该错误:
** (ArithmeticError) bad argument in arithmetic expression
m.ex:11: M.calc/0*
这是我的代码
def calc do
salary = IO.gets("What is your salary?") |> String.trim
x = salary
IO.puts "Your tithe this month is: #{(x * 0.01)}"
end
解决方法
出现此错误的原因是IO.gets
将为您提供二进制文件(例如字符串)。您可以使用IO.inspect(salary)
它可能会产生类似
的信息 "1000\n"
因此,您可能需要删除\n
,然后进行解析。您可以使用String.replace/4
您可能还需要删除其中包含的所有特殊字符(例如$
)。
然后,当您拥有数字本身时,可以使用String.to_integer/1
或String.to_float/1
来解析数字,具体取决于您期望的是整数还是浮点值。
基本工作版本可能是:
defmodule M do
def main do
calc()
end
def calc do
salary =
IO.gets("What is your salary?")
|> String.trim()
|> String.replace("\n","")
|> String.to_integer()
IO.puts "Your tithe this month is: #{salary * 0.01}"
end
end
假定数字将始终是整数。但是,当然,您可以添加更多逻辑来说明这两者。
您也可以改用Integer.parse/2
和Float.parse
,这可能有助于删除其他字符,例如:
defmodule M do
def main do
calc()
end
def calc do
{salary,_other_chars} =
IO.gets("What is your salary?")
|> Float.parse()
IO.puts "Your tithe this month is: #{salary * 0.01}"
end
end
这可能是一个更好,更通用的函数,但它将始终产生浮点数