[Solved] Float hiba pénznél - test case needed

Fórumok

Keresek olyan tesztesetet (C, C++, Java, Python vagy PHP preferred), ahol a floating point nehany muveletet utan mar a masodik tizedesjegynel rosszul kerekit (hibasan tarolt cent/penny). Igen, tudom hogy a penz mindig integer kell legyen, meg hogy PostgreSQL-ben van direkt Money adattipus pl. De kell a teszteset a hibas tervezesrol.

Elore is koszonom.

Update: olyan teszteset kell, ahol 2 tizedesjegyre kerekitve is hibas az eredmeny. 4. 5. tizedesjegynel elromlot en is tudok, meg talaltam is neten. Masodik tizedesjegyet mas kodjaban egyszer sikerult reprodukalnom aranylag keves muvelettel, es olyan kell.

Update 2: megvan



#include <stdio.h>
int main()
{
        float f = 90.1;
        int i;
        float origf = f;
        for (i = 1; i < 1000; ++i) {
                f = f + origf;
        }
        printf("Float is %lf\n", f);
        return 0;
}

Float is 90100.890625

Koszi Persicsb az otletet.

Hozzászólások

0.02 + 0.18 = 0.199999999999999998
És ez nem helyes eredmény. Persze, ha két tizedesre kerekíted, akkor 0.2 lesz, ami jó eredmény elvileg.

Vagy add össze a 0.03-mat százszor egymás után, majd hasonlítsd össze az eredmény 3-mal. sum(I=0..99) 0.03 < 3

És ez nyelvfüggetlen, az IEEE-754 szabványban mindig is így lesz, a gépi számokkal való számolás nagyon nagy hibákra vezethet.

A második tizedes jegy viszonylag egyszerű, nem?

(0.3-0.2) * 1000

Vagy valami hasonló.
--
blogom

Nagyon nagy hiba az indokolatlan float használat, ezt előbb-utóbb megtapasztalja mindenki aki a saját kárán szeret tanulni. :)

PHP-s példa ahol látszólag csődöt mond a józan ész: $ php -r 'var_dump(0.1 + 0.2 === 0.3); //false'

Amit viszont nem tudok elohozni: double-nel ilyen peldakod ami rossz mar a vegeredmenynel 2 tizedesjegyre kerekitve is. Valakinek van valami otlete?

Bármi, ami exponenciálisan nő, elég sok lépés után elromlik. Pl. kamatos kamat számolás, vagy ami lényegében ugyanaz, az e közelítése (1+1/n)^n-nel, n=10^15...10^16 körül. Tesztesetgyűjtemény a paranoia a netliben, http://www.netlib.org/paranoia/index.html