2011-01-20 44 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中使用兩個非整數的整數商,你必須在某個地方有某種明確的轉換步驟。