По определению целочисленное деление возвращает частное.
Почему 4613.9145 div 100.
выдает ошибку ("неверный аргумент")?
По определению целочисленное деление возвращает частное.
Почему 4613.9145 div 100.
выдает ошибку ("неверный аргумент")?
Для 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)
Итак, вам понадобится функция пола, которой нет в стандартной библиотеке.
% 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
float / int
, округленная часть, пол, потолок? Вы получаете ошибку неправильного аргумента, потому что аргументы операций должны быть определенного типа, а в вашем примере это не выполняется.
- person miku; 20.01.2011
Целочисленное деление в Erlang, div
, определено таким образом, что принимает два целых числа в качестве входных данных и возвращает целое число. Ссылка, которую вы дали в предыдущем комментарии, http://mathworld.wolfram.com/IntegerDivision.html, в своих примерах использует только целые числа, поэтому в данном обсуждении он не очень полезен. Использование trunc
и round
позволит вам использовать любые аргументы по вашему желанию.
Я не совсем понимаю, что вы подразумеваете под "определением". Разработчики языка могут определять операторы по своему усмотрению. В Erlang они определили div
для приема только целочисленных аргументов.
Если вам интересно узнать о проектных решениях создателей Erlang, вы можете написать им по электронной почте. Кроме того, если вы достаточно любопытны, чтобы просмотреть (замечательно короткую) грамматику, вы можете найти ее здесь. Удачи!
Не уверен, что ты ищешь, @Bertaud. Независимо от того, как это определено в другом месте, div
в Erlang работает только с целыми числами. Вы можете преобразовать аргументы в целые числа перед вызовом div
:
trunc(4613.9145) div 100.
или вы можете использовать /
вместо div
и впоследствии преобразовать частное в целое число:
trunc(4613.9145 / 100).
И trunc
может быть или не быть тем, что вы хотите - вы можете хотеть round
, пол или потолок (которые не определены в стандартной библиотеке Erlang, но их несложно определить самостоятельно, как это сделал miku с floor
выше). Это одна из причин, по которой Erlang ничего не принимает и не выполняет преобразование за вас. Но в любом случае, если вы хотите целочисленное частное двух нецелых чисел в Erlang, вы должны где-то иметь какой-то шаг явного преобразования.