round() и не правильное округление?

Royal Flash

-=MaestrO=-
Здравствуйте.

Стандартная функция php round() округляет математически не верно, пример ниже.

Код:
echo 'round(x, 2): 49,0044: '.(round(49.0044, 2)).'; '; // Ответ 49 - верно
echo '49,0049: '.(round(49.0049, 2)).'; '; // Ответ 49 - НЕ ВЕРНО
echo '49.0059: '. (round(49.0059, 2)); // Ответ 49.01 - верно
Ответом на округление числа 49,0049 до 2 знаков запятой так же должно быть 49,01, если начинать округление с последней цифры числа.

Есть ли функция php, производящая математически верное округление, или изобретать свой "велосипед"?
 

AnrDaemon

Продвинутый новичок
Выучите математику, прежде чем лезть в программирование.
Всё, что меньше половины, округляется в сторону нуля.
 

Вурдалак

Продвинутый новичок
При математическом округлении учитывается только старший разряд из отбрасываемых, всё верно.
 

Royal Flash

-=MaestrO=-
Выучите математику, прежде чем лезть в программирование.
Всё, что меньше половины, округляется в сторону нуля.
Вникните для начала в смысл поста, а потом пытайтесь кого-то учить. Понятно, что 49.004 округлится до 49.00, а 49.005 - 49.01, но вот если сначала округлить 49.0049 до тысячных - получим 49,005, а уже округляя до сотых из 49.005 получаем 49,01 (специально расписал для ОСОБО ОДАРЕННЫХ, кто не понимает смысла написанного выше, а гонится за кол-вом сообщений на форуме).

При математическом округлении учитывается только старший разряд из отбрасываемых, всё верно.
Если Вам не сложно, не бросите ссылочку, где такое написано, а то математику учил давно, не плохо было бы напомнить.

Такое последовательное округление важно, так как округляются копейки клиентов, и даже за 1 копейку некоторые готовы удавиться, хотя, если то, что написал Вурдалак === TRUE, так можно и ответить особо экономным :)
 

Redjik

Джедай-мастер
Такое последовательное округление важно, так как округляются копейки клиентов, и даже за 1 копейку некоторые готовы удавиться, хотя, если то, что написал Вурдалак === TRUE, так можно и ответить особо экономным :)
ну дак и округляй последовательно тогда
 

AnrDaemon

Продвинутый новичок
Вникните для начала в смысл поста, а потом пытайтесь кого-то учить. Понятно, что 49.004 округлится до 49.00, а 49.005 - 49.01, но вот если сначала округлить 49.0049 до тысячных - получим 49,005, а уже округляя до сотых из 49.005 получаем 49,01 (специально расписал для ОСОБО ОДАРЕННЫХ, кто не понимает смысла написанного выше, а гонится за кол-вом сообщений на форуме).
Специально для особо одарённых существуют правила обращения с денежными единицами при вычислениях на компьютере. Имеющие очень отдалённое отношение к математике.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
а не особо одаренным полезно будет узнать, что
1. по международным стандартам суммы надо хранить с точностью до 5го знака, а не до 2го, чтобы не было проблем
2. для работы с деньгами описан специальный паттерн http://amdy.su/pattern-money/
 

artoodetoo

великий и ужасный
суммы надо хранить с точностью до 5го знака
вроде до 4го. стандарта не видел, но везде где пишут про "GAAP compliant currency" встречаю именно такие рекомендации.
алсо, Basic от MS, MS SQL, Delphi во встроенных типах currency — 4 знака после запятой.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
а может, и 4, мог забыть, это прописано в банковских законах всех стран
 
Сверху