sql >> Database teknologi >  >> RDS >> Sqlserver

Brug float eller decimal til regnskabsapplikation dollarbeløb?

Skal datatypen Float eller Decimal bruges til dollarbeløb?

Svaret er nemt. Flyder aldrig. ALDRIG !

Floats var ifølge IEEE 754 altid binære, kun den nye standard IEEE 754R definerede decimalformater. Mange af de binære brøkdele kan aldrig svare til den nøjagtige decimalrepræsentation.

Ethvert binært tal kan skrives som m/2^n (m , n positive heltal), ethvert decimaltal som m/(2^n*5^n) .Da binære filer mangler primtallet factor 5 , kan alle binære tal repræsenteres nøjagtigt med decimaler, men ikke omvendt.

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

Så du ender med et tal enten højere eller lavere end det givne decimaltal. Altid.

Hvorfor betyder det noget? Afrunding.

Normal afrunding betyder 0..4 ned, 5..9 op. Så det gør betyder noget om resultatet er enten 0.049999999999 .... eller 0.0500000000 ... Du ved måske, at det betyder 5 cent, men computeren ved det ikke og runder 0.4999 ... ned (forkert) og 0.5000 ... op (højre).

I betragtning af at resultatet af flydende kommaberegninger altid indeholder små fejltermer, er beslutningen rent held. Det bliver håbløst, hvis du vil have decimal afrunding til lige håndtering med binære tal.

Ikke overbevist? Du insisterer på, at alt er helt ok i dit kontosystem? Aktiver og passiver lige store? Ok, så tag hvert af de givne formaterede tal for hver post, parse dem og summer dem med et uafhængigt decimalsystem!

Sammenlign det med den formaterede sum. Ups, der er noget galt, ikke?

Til den beregning krævedes ekstrem nøjagtighed og pålidelighed (vi brugte Oracle's FLOAT), så vi kunne registrere "milliarddelen af ​​en krone", der blev akkumuleret.

Det hjælper ikke mod denne fejl. Fordi alle mennesker automatisk antager, at computeren summerer rigtigt, og praktisk talt ingen kontrollerer uafhængigt.



  1. Hvad betyder det, når en PostgreSQL-proces er inaktiv i transaktionen?

  2. Ændre på Big Table i RDS Løsning til tabel fuld fejl

  3. PostgreSQL-replikeringsopsætning og vedligeholdelse ved hjælp af Ansible

  4. SQL Server bruger høj CPU, når der søges i nvarchar-strenge