![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
ginnie |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемые коллеги!
Раньше не сталкивался со следующим нюансом округления при помощи printf():
выводит 100
выводит 102. Кто скажет, почему так происходит ![]() -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
||||
|
|||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
переход строка-число.
# for i in {0..10}; do perl -le 'printf "%.0f\n",$ARGV[0]' $i.50; done 0 2 2 4 4 6 6 8 8 10 10 # |
|||
|
||||
KSURi |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
banker's rounding
-------------------- Died at Life.pl line 21 |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
KSURi, молодец, верно указал источник неоднозначности!
P.S. сам раньше нигде про этот нюанс информации не встречал (если кто знает, где про это есть в документации - сообщите). Сегодня случайно увидел вопрос на сайте PerlMonks (A bug of sprintf or not?). P.P.S. KSURi, ты знал, или тоже на PerlMonks увидел? Это сообщение отредактировал(а) ginnie - 20.10.2008, 19:33 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 17 Всего: 18 |
ginnie, а я сталкивался
![]() |
|||
|
||||
KSURi |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
ginnie, видел на PerlMonks, только другой топик. Сталкиваться не приходилось пока.
-------------------- Died at Life.pl line 21 |
|||
|
||||
IceSunrise |
|
||||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 61 Регистрация: 7.4.2008 Где: Санкт-Петербург Репутация: 3 Всего: 3 |
Здесь есть еще один нюанс. Нужно принимать во внимание еще и машинное представление чисел с плавающей точкой.
Получаем вывод:
Следуя алгоритму банковского округления:
Мы должны получить: 0.25 -> 0.2 (есть) 0.35 -> 0.4 0.65 -> 0.6 Проблему увидим, если посмотрим на округляемое число пристальнее:
Все честно, с точки зрения округления... Модуль Math::BigFloat помогает решить проблему.
|
||||||||||||
|
|||||||||||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |