Целочисленное деление
По определению целочисленное деление возвращает частное.
Зачем 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, у вас должен быть какой-то явный шаг преобразования где-нибудь.