首页 > 解决方案 > 我正在尝试对长生不老药中的输入数据执行数学运算,但它会引发算术错误

问题描述

我是 elixir 的新手,在这种情况下,我正在尝试对收到的数据执行数学运算,计算从用户那里获得的薪水的十分之一并抛出此错误:

** (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

标签: elixir

解决方案


你得到这个错误的原因是它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/2andFloat.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

它可能是一个更好、更通用的函数,但它总是会产生一个浮点数


推荐阅读