Czy mogę polegać na precyzyjnym obejściu PHP php.ini dla problemu zmiennoprzecinkowego

Znalazłem pewne obejścieproblem zmiennoprzecinkowy w PHP:

ustawienie php.iniprecision = 14

342349.23 - 341765.07 = 584.15999999992 // floating point problem

ustawienie php.ini, powiedzmyprecision = 8

342349.23 - 341765.07 = 584.16 // voila!

Próbny:http://codepad.org/r7o086sS

Jak to źle?

1. Czy mogę polegać na tym rozwiązaniu, jeśli potrzebuję tylko dokładnych 2-cyfrowych obliczeń (pieniędzy)?

2. Jeśli nie, możesz podać mi wyraźny przykład, kiedy te rozwiązania zawiodą?

Edytuj: 3. Która wartość php.ini.precision pasuje do dwóch najlepszych cyfr, obliczenia pieniężne

Proszę pamiętać, że nie mogę używać obliczeń całkowitych (float * 100 = centy), jest na to za późno.Nie będę pracował nad liczbami wyższymi niż 10 ^ 6Nie muszę porównywać liczbAKTUALIZACJA

Odpowiedź @Baba jest dobra, ale użyłprecision=20, precision=6 w swoich testach ... Więc nadal nie jestem pewien, czy to zadziała, czy nie.

Rozważ następujące kwestie:

Powiedzmyprecision = 8 i jedyne co robię to dodawanie+ i odejmowanie-

A + B = C

A - B = C

Pytanie 1: Czy precyzyjne obejście nie powiedzie się dla liczb od 0..999999.99, gdzie A i B to liczba z miejscami po przecinku? Jeśli tak, podaj mi przykład.

Prosty test wykona zadanie:

// if it fails what if I use 9,10,11 ???
// **how to find when it fails??? **
ini_set('precision', 8); 
for($a=0;$a<999999.99;$a+=0.01) {
  for($b=0;$b<999999.99;$b+=0.01) {
     // mind I don't need to test comparision (round($a-$b,2) == ($a-$b))
     echo ($a + $b).','.($a - $b)." vs ";
     echo round($a + $b, 2).','.round($a - $b, 2)."\n";
  }
}

ale oczywiście99999999 * 2 jest za duża praca, więc nie mogę uruchomić tego testu

Pytanie 2: Jak oszacować / obliczyć, kiedy obejdzie się obejście precyzji? Bez takich szalonych testów?Czy jest na to jakaś matematyka *? Jak obliczyć będzie się nie udać?

* Nie muszę znać obliczeń zmiennoprzecinkowych, ale gdy obejście nie powiedzie się, jeśli znasz precyzję i zakres A i B

Proszę o uwagęNaprawdę wiem centy i bcmath są najlepszym rozwiązaniem. Ale nadal nie jestem pewien, czy obejście się nie powiedzie lub nie, aby odjąć i dodać

questionAnswers(5)

yourAnswerToTheQuestion