целочисленное деление - PullRequest
       38

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

5 голосов
/ 20 января 2011

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

Почему 4613.9145 div 100. выдает ошибку («неверный аргумент»)?

Ответы [ 4 ]

14 голосов
/ 20 января 2011

Для 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, которой нет в стандартной библиотеке.

% 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
5 голосов
/ 21 января 2011

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

1 голос
/ 20 января 2011

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

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

0 голосов
/ 12 апреля 2013

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

trunc(4613.9145) div 100.

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

trunc(4613.9145 / 100).

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

...