Целочисленное деление

По определению целочисленное деление возвращает частное.

Зачем 4613.9145 div 100. выдает ошибку ("плохой аргумент")?

4 ответа

За 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


Обновление: целочисленное деление, иногда обозначается \, может быть определено как:

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

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

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

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

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

trunc(4613.9145) div 100.

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

trunc(4613.9145 / 100).

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

Другие вопросы по тегам