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ć liczbAKTUALIZACJAOdpowiedź @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ć