2011-01-20 43 views
4

按定义,整数除法返回商。整数除法

为什么4613.9145 div 100.给出一个错误(“坏论点”)?

回答

13

对于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) 

所以你需要一个floor函数,它不在标准lib中。

% 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 
+0

我不同意:结果是46,而不是46.139145。 div =整数除法,/ =浮点除法 – Bertaud 2011-01-20 17:13:19

+0

无论你提出什么,这是不合逻辑的。trunc(N/100)给出结果。 div函数似乎不尊重整数除法的定义。 – Bertaud 2011-01-20 17:51:02

1

我不知道你相当的意思 “的定义。”语言设计者可以自由地定义他们想要的操作符。在Erlang中,他们定义了div只接受整数参数。

如果您有兴趣了解Erlang创作者的设计决策,可以给他们发邮件。另外,如果你足够好奇地筛选(非常短的)文法,你可以找到它here。好运!

5

Erlang中的整数除法div定义为将两个整数作为输入并返回一个整数。您在之前的评论http://mathworld.wolfram.com/IntegerDivision.html中给出的链接仅在其示例中使用整数,因此在此讨论中没有多大用处。使用truncround将允许您使用您希望的任何参数。

0

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

trunc(4613.9145) div 100. 

,或者您可以使用/,而不是div和商转变为后来的整数:

trunc(4613.9145/100). 

而且trunc可能会或可能不会是什么你想 - 你可能想要round,或地板或天花板(在Erlang的标准库中没有定义,但不难定义你自己,因为miku用上面的floor做过)。这是Erlang不承担任何事情并为您完成转换的原因之一。但无论如何,如果你想在Erlang中使用两个非整数的整数商,你必须在某个地方有某种明确的转换步骤。