2011-01-20 3 views

ответ

13

Для аргументов div аргументы должны быть целыми числами. / принимает произвольные числа в качестве аргументов, особенно float. Так для примера, следующий будет работать:

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


Update: 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 
+0

Я не согласен: в результате получается 46, а не 46.139145. div = целое деление,/= деление с плавающей запятой – Bertaud

+0

все, что вы предлагаете, это нелогично.trunc (N/100) дает результат. Функция div, по-видимому, не учитывает определение целочисленного деления. – Bertaud

+1

@Bertaud: Ок, извините, не означал что-то путать. Но тогда попробуйте перефразировать свой вопрос, чтобы ответы могли быть более целенаправленными. Вы хотите, чтобы целая часть подразделения 'float/int', округленная часть, пол, потолок? Вы получаете ошибку с неправильным аргументом, потому что аргументы для операций должны быть определенного типа, а в вашем примере это не выполняется. – miku

1

Я не знаю совсем то, что вы имеете в виду под "определение". Разработчики языка могут свободно определять операторов, как бы они ни пожелали. В Erlang они определили div, чтобы принимать только целые аргументы.

Если это дизайнерские решения создателей Erlang, которые вас интересуют, вы можете отправить их по электронной почте. Кроме того, если вам достаточно любопытно просеять (удивительно короткую) грамматику, вы можете найти ее here. Удачи!

+0

да и нет. Прочтите еще раз http://mathworld.wolfram.com/IntegerDivision.html. Конечно, вы можете определить выражение (1 == 1) как ложное, но вы беспокоите всех людей с этим. – Bertaud

+0

Типы a и b в этой ссылке не определены. Я думаю, что это сильно подразумевается примером, который использует целые числа и выражает промежуточный результат как дробь, что a и b являются целыми числами. – cthulahoops

5

Целочисленное деление в Erlang, div, определяется как взятие двух целых чисел и возвращает целое число. Ссылка, которую вы даете в более раннем комментарии, http://mathworld.wolfram.com/IntegerDivision.html, использует только целые числа в своих примерах, поэтому в этой дискуссии это не очень полезно. Используя trunc и round, вы сможете использовать любые аргументы.

0

Не уверен, что вы ищете, @Bertaud. Независимо от того, как это определено в другом месте, файл div Erlang работает только с целыми числами. Вы можете преобразовать аргументы целых чисел перед вызовом div:

trunc(4613.9145) div 100. 

или вы можете использовать / вместо div и преобразовать фактор в целое число после нее:

trunc(4613.9145/100). 

И trunc может или не может быть то, что вы хотите - вы можете захотеть round, или пол или потолок (которые не определены в стандартной библиотеке Erlang, но их нетрудно определить, так как miku сделал с floor выше). Это связано с тем, что Эрланг не принимает на себя что-то и делает для вас конверсию. Но в любом случае, если вы хотите получить целочисленное частное от двух нецелых чисел в Erlang, у вас должен быть какой-то явный шаг преобразования где-нибудь.

Смежные вопросы