Erlang 整数除法

Erlang 整数除法,erlang,integer,division,Erlang,Integer,Division,根据定义,整数除法返回商 为什么4613.9145第100部分。给出错误(“错误参数”) 对于div参数必须是整数/接受任意数字作为参数,尤其是浮点数。因此,对于您的示例,以下方法可行: 1> 4613.9145 / 100. 46.139145 要对比差异,请尝试: 2> 10 / 10. 1.0 3> 10 div 10. 1 文件: 更新:,有时表示为\,可定义为: a \ b = floor(a / b) 所以您需要一个floor函数,它不在标准库中 %

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


为什么
4613.9145第100部分。
给出错误(“错误参数”)

对于
div
参数必须是整数
/
接受任意数字作为参数,尤其是浮点数。因此,对于您的示例,以下方法可行:

1> 4613.9145 / 100.  
46.139145
要对比差异,请尝试:

2> 10 / 10.
1.0

3> 10 div 10.
1
文件:


更新:,有时表示为
\
,可定义为:

a \ b = floor(a / b)
所以您需要一个floor函数,它不在标准库中

% 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) .

我不太明白你所说的“定义”是什么意思。语言设计者可以随意定义运算符。在Erlang中,他们定义了
div
,只接受整数参数


如果您感兴趣的是Erlang创建者的设计决策,您可以通过电子邮件发送给他们。此外,如果你对语法(非常简短)有足够的好奇心,你可以找到它。祝你好运

Erlang中的整数除法定义为将两个整数作为输入并返回一个整数。您在前面的注释中给出的链接在其示例中仅使用整数,因此在本讨论中并不真正有用。使用
trunc
round
将允许您使用任何您想要的参数。

不确定您在寻找什么,@Bertaud。不管其他地方如何定义,Erlang的
div
只对整数有效。在调用
div
之前,可以将参数转换为整数:

trunc(4613.9145) div 100.
或者您可以使用
/
而不是
div
,然后将商转换为整数:

trunc(4613.9145 / 100).

trunc
可能是也可能不是您想要的-您可能想要
圆形的
,或者地板或天花板(这在Erlang的标准库中没有定义,但不难定义自己,就像上面miku对
地板所做的那样)。这就是Erlang不承担某些任务并为您进行转换的部分原因。但是在任何情况下,如果你想从Erlang中的两个非整数得到一个整数商,你必须在某个地方有某种明确的转换步骤。

我不同意:结果是46,而不是46.139145。div=整数除法,/=浮点除法无论你提出什么,都是不合逻辑的。trunc(N/100)给出了结果。div函数似乎不尊重整数除法的定义。@Bertaud:好的,对不起,这里没有混淆任何东西的意思。但是,试着重新表述你的问题,这样答案才能更有针对性。您想要一个
浮点/int
除法的整数部分、四舍五入部分、地板和天花板吗?您得到了一个错误的参数错误,因为操作的参数必须是某种类型的,在您的示例中,这是不能满足的。@Bertaud:您的问题很有趣,可能您怀疑这里有不一致之处。试着在你的问题中表达这一点,让它更有趣,让更多的人看它,也许还有一个比我更好的答案。我只想做两个数字的整数除法!数学上定义了整数除法:返回结果的商。我可以补充什么?也许erlang还有另一个定义?是和否。请再读一遍。当然,您可以将表达式(1==1)定义为false,但这会给所有人带来麻烦。该链接中的a和b类型没有定义。我认为这个例子强烈暗示了这一点,它使用整数,并将中间结果表示为a和b是整数的分数。
trunc(4613.9145 / 100).