Как я могу округлить десятичное число (с плавающей запятой) до ближайшего целого числа?
например
1.2 = 1
1.7 = 2
источник
Как я могу округлить десятичное число (с плавающей запятой) до ближайшего целого числа?
например
1.2 = 1
1.7 = 2
Выход из perldoc -q round
Есть ли в Perl функция round ()? Что насчет ceil () и floor ()? Триг функции?Помните, что
int()
просто усекается в сторону0
. Для округления до определенного количества цифрsprintf()
или,printf()
как правило, самый простой маршрут.
printf("%.3f", 3.1415926535); # prints 3.142
POSIX
Модуль (часть стандартного дистрибутива Perl) реализуетceil()
,floor()
и ряд других математических и тригонометрических функций.
use POSIX; $ceil = ceil(3.5); # 4 $floor = floor(3.5); # 3
В 5.000 до 5.003 perls, тригонометрия была выполнена в
Math::Complex
модуле. В версии 5.004Math::Trig
модуль (часть стандартного распределения Perl) реализует тригонометрические функции. Внутренне он используетMath::Complex
модуль, и некоторые функции могут вырваться из реальной оси в комплексную плоскость, например, обратный синус 2.Округление в финансовых приложениях может иметь серьезные последствия, и используемый метод округления должен быть точно указан. В этих случаях, вероятно, стоит не верить тому, какое системное округление используется Perl, а вместо этого реализовать функцию округления, в которой вы нуждаетесь сами.
Чтобы понять почему, обратите внимание на то, что у вас все еще будет проблема с чередованием на полпути:
for ($i = 0; $i < 1.01; $i += 0.05) { printf "%.1f ",$i} 0.0 0.1 0.1 0.2 0.2 0.2 0.3 0.3 0.4 0.4 0.5 0.5 0.6 0.7 0.7 0.8 0.8 0.9 0.9 1.0 1.0
Не вините Perl. Это так же, как в C. IEEE говорит, что мы должны сделать это. Числа Perl, абсолютные значения которых являются целыми числами
2**31
(на 32-битных машинах), будут работать почти как математические целые числа. Другие номера не гарантируются.
printf
если вы хотите получить результат в переменной, используйтеsprintf
... надеюсь, это сэкономит вам некоторое время отладки :-Pint()
на PDL?Несмотря на несогласие со сложными ответами о промежуточных отметках и т. Д., Для более распространенного (и, возможно, тривиального) варианта использования:
my $rounded = int($float + 0.5);
ОБНОВИТЬ
Если вы
$float
можете быть отрицательным, следующий вариант даст правильный результат:my $rounded = int($float + $float/abs($float*2 || 1));
При таком расчете -1,4 округляется до -1, а с -1,6 до -2, и ноль не взорвется.
источник
Вы можете использовать модуль вроде Math :: Round :
Или вы можете сделать это грубым способом:
источник
Если вы решили использовать printf или sprintf, обратите внимание, что они используют метод округления от половины до четности.
источник
Смотрите perldoc / perlfaq :
источник
Вам не нужен внешний модуль.
Возможно, я упускаю вашу точку зрения, но я подумал, что это намного более чистый способ сделать ту же работу.
Для этого нужно пройти через все положительные числа в элементе, напечатать число и округленное целое число в указанном вами формате. Код объединяет соответствующее округленное положительное целое число только на основе десятичных знаков. Int ($ _) в основном круглые вниз числа так ($ -INT ($ )) захватывает десятичные. Если десятичные дроби (по определению) строго меньше 0,5, округлите число вниз. Если нет, округлите, добавив 1.
источник
Следующее округляет положительные или отрицательные числа до заданной десятичной позиции:
источник
Ниже приведен пример пяти различных способов суммирования значений. Первый - наивный способ выполнить суммирование (и не удается). Второй пытается использовать
sprintf()
, но это тоже не удается. Третий используетsprintf()
успешно, в то время как последние два (4 и 5) использованияfloor($value + 0.5)
.Обратите внимание, что
floor($value + 0.5)
можно заменить на,int($value + 0.5)
чтобы удалить зависимость отPOSIX
.источник
Отрицательные числа могут добавить некоторые причуды, о которых нужно знать людям.
printf
подходы в стиле дают нам правильные числа, но могут привести к некоторым странным проявлениям. Мы обнаружили, что этот метод (по моему мнению, глупо) ставит-
знак того, должен ли он или не должен. Например, -0.01, округленное до одного десятичного знака, возвращает -0.0, а не просто 0. Если вы собираетесь использоватьprintf
стилевой подход и знаете, что не хотите использовать десятичную дробь, используйте%d
и нет%f
(когда вам нужны десятичные дроби, это когда дисплей становится шатким).Хотя это правильно и для математики не имеет большого значения, для отображения это выглядит просто странно, показывая что-то вроде "-0.0".
Для метода int отрицательные числа могут изменить то, что вы хотите в результате (хотя есть некоторые аргументы, которые можно привести, они верны).
int + 0.5
Вызывает реальные проблемы с -отрицательные числами, если вы хотите работать именно так, но я думаю , что большинство людей этого не делают. -0.9, вероятно, должно округляться до -1, а не 0. Если вы знаете, что хотите, чтобы отрицание было потолком, а не полом, то вы можете сделать это в одной строке, в противном случае вы можете использовать метод int с второстепенным модификация (это, очевидно, работает только для получения целых чисел:источник
Мое решение для sprintf
источник
Если вас интересует только получение целочисленного значения из целого числа с плавающей запятой (т. Е. 12347,9999 или 54321,0001), этот подход (заимствованный и измененный сверху) поможет:
источник
читая документацию о том, как округлять числа, многие эксперты предлагают написать свои собственные процедуры округления, поскольку «консервированная» версия, поставляемая с вашим языком, может быть недостаточно точной или содержать ошибки. Я думаю, однако, они говорят много десятичных знаков, а не только один, два или три. Имея это в виду, вот мое решение (хотя и НЕ ТОЧНО, как просили, поскольку мои потребности в отображении долларов - процесс не сильно отличается).
источник
if ($digit3 >= 5) { $digit3 = 0; $digit2++; if ($digit2 > 9) { $digit2 = 0; $digit1++; if ($digit1 > 9) { $digit1 = 0; $cost[0]++; } } }
так оно и есть:if ($digit1 >= 5) { $digit1 = 0; $cost[0]++; }
тогда простоreturn commafied($cost[0]);
источник