我正在尝试对e药中的输入数据执行数学运算,但会引发算术错误

问题描述

我不老长生不老药,在这种情况下,我试图对接收到的数据执行数学运算,计算从用户那里获得的工资的十分之一,并抛出该错误

** (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/1String.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/2Float.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

这可能是一个更好,更通用的函数,但它将始终产生浮点数