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, производящая математически верное округление, или изобретать свой "велосипед"?
 
Выучите математику, прежде чем лезть в программирование.
Всё, что меньше половины, округляется в сторону нуля.
 
При математическом округлении учитывается только старший разряд из отбрасываемых, всё верно.
 
Выучите математику, прежде чем лезть в программирование.
Всё, что меньше половины, округляется в сторону нуля.

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

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

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

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

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