整数除法

时间:2011-01-20 16:41:19

标签: erlang integer division

根据定义,整数除法返回商。

为什么4613.9145 div 100.会出错(“坏参数”)?

4 个答案:

答案 0 :(得分:14)

对于div,参数必须是整数。 /接受任意数字作为参数,尤其是浮点数。因此,对于您的示例,以下内容将起作用:

1> 4613.9145 / 100.  
46.139145

要区别对比,请尝试:

2> 10 / 10.
1.0

3> 10 div 10.
1

文档:http://www.erlang.org/doc/reference_manual/expressions.html


更新:Integer division,有时标记为\,可以定义为:

a \ b = floor(a / b)

所以你需要一个不在标准库中的楼层功能。

% intdiv.erl
-module(intdiv).
-export([floor/1, idiv/2]).

floor(X) when X < 0 ->
    T = trunc(X),
    case X - T == 0 of
        true -> T;
        false -> T - 1
    end;

floor(X) -> 
    trunc(X) .

idiv(A, B) ->
    floor(A / B) .

用法:

$ erl
...
Eshell V5.7.5  (abort with ^G)
> c(intdiv).
{ok,intdiv}
> intdiv:idiv(4613.9145, 100).
46

答案 1 :(得分:5)

Erlang中的整数除法div被定义为将两个整数作为输入并返回一个整数。您在之前的注释http://mathworld.wolfram.com/IntegerDivision.html中提供的链接仅在其示例中使用整数,因此在此讨论中并不真正有用。使用truncround将允许您使用任何您想要的参数。

答案 2 :(得分:1)

我不太清楚“定义”是什么意思。语言设计者可以根据自己的意愿自由定义运算符。在Erlang中,他们定义div只接受整数参数。

如果是您想知道的Erlang创作者的设计决定,您可以通过电子邮件发送给他们。另外,如果你有足够的好奇心来筛选(非常短的)语法,你可以找到它here。祝你好运!

答案 3 :(得分:0)

不确定你在找什么,@ Bergaud。无论在其他地方如何定义,Erlang的div仅适用于整数。您可以在调用div之前将参数转换为整数:

trunc(4613.9145) div 100.

或者您可以使用/代替div,然后将商转换为整数:

trunc(4613.9145 / 100).

trunc可能是你想要的,也可能不是你想要的round,或者是地板或天花板(在Erlang的标准库中没有定义,但是你自己也不难定义,正如miku对floor所做的那样。这是Erlang没有假设某些东西并为你做转换的部分原因。但无论如何,如果你想在Erlang中使用两个非整数的整数商,你必须在某处进行某种显式的转换步骤。