2010-02-12 4 views
8

Wie wir alle wissen, ist Gleitkommaarithmetik nicht immer vollständig genau, aber wie gehen Sie mit ihren Inkonsistenzen um?Wie man mit seltsamer Rundung von Gleitkommazahlen in PHP umgeht

Als Beispiel in PHP 5.2.9: (dies nicht geschieht in 5,3)

echo round(14.99225, 4); // 14.9923 
echo round(15.99225, 4); // 15.9923 
echo round(16.99225, 4); // 16.9922 ?? 
echo round(17.99225, 4); // 17.9922 ?? 
echo round(25.99225, 4); // 25.9922 ?? 
echo round(26.99225, 4); // 26.9923 

Wie würden Sie dieses Problem umgehen?

Antwort

4

Wie gehen Sie mit seinen Inkonsistenzen um?

  • Für Sachen, wo exakte Ergebnisse basierend auf Dezimaldarstellung Angelegenheiten (dh Geld), nicht verwenden IEEE754 Schwimmern, die Sie verwenden „bignum“ Bibliotheken wie BCMath
  • Für Sachen, wo Sie Ihre Berechnungen müssen nur zu sein relativ präzise (wie die meisten wissenschaftlichen Berechnungen), verwenden Sie numerically stable Algorithmen, so dass die Inkonsistenzen bleiben in den am wenigsten signifikanten Bits (wo sie nicht wichtig sind).