sql >> Databáze >  >> RDS >> Sqlserver

Použít plovoucí nebo desetinné číslo pro dolarovou částku účetní aplikace?

Měl by být pro částky v dolarech použit datový typ Float nebo Decimal?

Odpověď je snadná. Nikdy neplave. NIKDY !

Floaty byly podle IEEE 754 vždy binární, pouze nový standard IEEE 754R definoval dekadické formáty. Mnoho zlomkových binárních částí se nikdy nemůže rovnat přesné desítkové reprezentaci.

Jakékoli binární číslo lze zapsat jako m/2^n (m , n kladná celá čísla), libovolné desetinné číslo jako m/(2^n*5^n) .Protože binárním souborům chybí prvočíslo factor 5 , všechna binární čísla mohou být přesně reprezentována desetinnými místy, ale ne naopak.

0.3 = 3/(2^1 * 5^1) = 0.3

0.3 = [0.25/0.5] [0.25/0.375] [0.25/3.125] [0.2825/3.125]

          1/4         1/8         1/16          1/32

Takže skončíte s číslem vyšším nebo nižším, než je dané desetinné číslo. Vždy.

Proč na tom záleží? Zaokrouhlení.

Normální zaokrouhlení znamená 0..4 dolů, 5..9 nahoru. Takže to dělá záleží, jestli je výsledek buď 0.049999999999 .... nebo 0.0500000000 ... Možná víte, že to znamená 5 centů, ale počítač to neví a zaokrouhlí 0.4999 ... dolů (špatně) a 0.5000 ... nahoru (vpravo).

Vzhledem k tomu, že výsledek výpočtů s plovoucí desetinnou čárkou vždy obsahuje malé chybové členy, je rozhodnutí čisté štěstí. Je to beznadějné, pokud chcete s binárními čísly zaokrouhlit na desítkovou soustavu.

Nepřesvědčený? Trváte na tom, že ve vašem účetním systému je vše naprosto v pořádku? Aktiva a pasiva jsou stejná? Dobře, pak vezměte každé z daných formátovaných čísel každého záznamu, analyzujte je a sečtěte nezávislou desetinnou soustavou!

Porovnejte to s formátovaným součtem. Jejda, něco je špatně, že?

Pro tento výpočet byla vyžadována extrémní přesnost a věrnost (použili jsme Oracle'sFLOAT), abychom mohli zaznamenat „miliardtiny penny“, které byly naúčtovány.

Proti této chybě to nepomůže. Protože všichni lidé automaticky předpokládají, že počítač sčítá správně, a prakticky nikdo nekontroluje nezávisle.



  1. Hromadný import SQL z CSV

  2. Připojte se k databázi PostgreSQL na kontejneru Docker

  3. Jak odstraním pevný počet řádků s řazením v PostgreSQL?

  4. Jak exportovat data z SQL Server 2005 do MySQL