Přihlášení

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 .

  1. Function roundit(number,decPoints)
  2. decPoints = 10^decPoints
  3. roundit = round(number*decPoints+0.1)/decPoints
  4. End Function

Poslat nový komentář
  • Webové a e-mailové adresy jsou automaticky převedeny na odkazy.
  • Povolené HTML značky: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <blockcode>
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>. PHP source code can also be enclosed in <?php ... ?> or <% ... %>.
  • Řádky a odstavce se zalomí automaticky.

Více informací o možnostech formátování

CAPTCHA
Tato otázka je pro testování jestli jste návštěvník nebo spam robot..
Image CAPTCHA
Enter the characters shown in the image.