Opatrně s funkcí round()
Včera jsme s kolegy v práci narazily na nestandartní chování funkce round která zaokrouhluje číselné hodnoty trošku jinak než jsme zvyklí..
Funkce round by měla, jak je na vetšině zdrojů napsáno, zaokrouhlovat podle matematických pravidel, déle ale budete hledat než najdete proč tomu tak vlastně u Redmontských funkcí není. Hledal jsem důvod pro toto nestandartní chování a po chvilce googlení jsem narazil na několika forech na to že tento neduh je obsažen i v .NET frameworcích.
Koukněte na následující pár případů :
2.49999999999999 -> 2
2.50000000000000 -> 2
2.50000000000001 -> 3
3.49999999999999 -> 3
3.50000000000000 -> 4
3.50000000000001 -> 4
4.49999999999999 -> 4
4.50000000000000 -> 4
4.50000000000001 -> 5
5.49999999999999 -> 5
5.50000000000000 -> 6
5.50000000000001 -> 6
Funkce round totiž zaokrouhluje podle tzv Bankovního zaokrouhlování, na následujícím odkazu na msdn najdete v originále odůvodnění.
Ve zkratce se tam říká že bankovní zaokrouhlovaní disponuje menší chybovostí než zaokrouhlování normální. Na tom sice asi něco bude, ale je dobré mít na paměti že v některých případech. zejmena při matematickych, muže dojít ke zkreslení výsledku.
Pokud nechcete dopadnout jako my, musime v celem projektu funkci nahradit, skuste si do své knihovničky scriptů přidat následující funkci kterou jsem našel na jinak velmi užitečné stránce .
Function roundit(number,decPoints) decPoints = 10^decPoints roundit = round(number*decPoints+0.1)/decPoints End Function
