По определению целочисленное деление возвращает частное.целочисленное деление
Почему 4613.9145 div 100.
дает ошибку («плохой аргумент»)?
По определению целочисленное деление возвращает частное.целочисленное деление
Почему 4613.9145 div 100.
дает ошибку («плохой аргумент»)?
Для аргументов 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
Я не знаю совсем то, что вы имеете в виду под "определение". Разработчики языка могут свободно определять операторов, как бы они ни пожелали. В Erlang они определили div
, чтобы принимать только целые аргументы.
Если это дизайнерские решения создателей Erlang, которые вас интересуют, вы можете отправить их по электронной почте. Кроме того, если вам достаточно любопытно просеять (удивительно короткую) грамматику, вы можете найти ее here. Удачи!
да и нет. Прочтите еще раз http://mathworld.wolfram.com/IntegerDivision.html. Конечно, вы можете определить выражение (1 == 1) как ложное, но вы беспокоите всех людей с этим. – Bertaud
Типы a и b в этой ссылке не определены. Я думаю, что это сильно подразумевается примером, который использует целые числа и выражает промежуточный результат как дробь, что a и b являются целыми числами. – cthulahoops
Целочисленное деление в Erlang, div
, определяется как взятие двух целых чисел и возвращает целое число. Ссылка, которую вы даете в более раннем комментарии, http://mathworld.wolfram.com/IntegerDivision.html, использует только целые числа в своих примерах, поэтому в этой дискуссии это не очень полезно. Используя trunc
и round
, вы сможете использовать любые аргументы.
Не уверен, что вы ищете, @Bertaud. Независимо от того, как это определено в другом месте, файл div
Erlang работает только с целыми числами. Вы можете преобразовать аргументы целых чисел перед вызовом div
:
trunc(4613.9145) div 100.
или вы можете использовать /
вместо div
и преобразовать фактор в целое число после нее:
trunc(4613.9145/100).
И trunc
может или не может быть то, что вы хотите - вы можете захотеть round
, или пол или потолок (которые не определены в стандартной библиотеке Erlang, но их нетрудно определить, так как miku сделал с floor
выше). Это связано с тем, что Эрланг не принимает на себя что-то и делает для вас конверсию. Но в любом случае, если вы хотите получить целочисленное частное от двух нецелых чисел в Erlang, у вас должен быть какой-то явный шаг преобразования где-нибудь.
Я не согласен: в результате получается 46, а не 46.139145. div = целое деление,/= деление с плавающей запятой – Bertaud
все, что вы предлагаете, это нелогично.trunc (N/100) дает результат. Функция div, по-видимому, не учитывает определение целочисленного деления. – Bertaud
@Bertaud: Ок, извините, не означал что-то путать. Но тогда попробуйте перефразировать свой вопрос, чтобы ответы могли быть более целенаправленными. Вы хотите, чтобы целая часть подразделения 'float/int', округленная часть, пол, потолок? Вы получаете ошибку с неправильным аргументом, потому что аргументы для операций должны быть определенного типа, а в вашем примере это не выполняется. – miku