| 
| 
 | Вопрос # 5 939/ вопрос открыт / | 
 |  Здравствуйте, эксперты!Пожалуйста, помогите понять почему в этом коде условие выполняется.
 Что-то я затупил совсем.
 
 
 <?
$user_id=1;
$allpayout=2.12;
$allbalance=11.98428225;
$balance=9.86428225;
 
if ($allpayout!=$allbalance - $balance){
  echo "user_id=$user_id; не прошёл контроль $allpayout<>$allbalance-$balance";
}
?>
|  |   Вопрос задал: VKHacker (статус: 1-ый класс)Вопрос отправлен: 8 февраля 2012, 20:26
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 6; последнее сообщение — 11 февраля 2012, 04:37; участников в обсуждении: 5. 
|   | Ерёмин А.А. (статус: *Администратор), 8 февраля 2012, 20:31 [#1]:Скорее всего, из-за вещественных чисел. Вместо a == b нужно использовать что-то вроде abs(a-b) < 0.0001. |  
|   | VKHacker (статус: 1-ый класс), 8 февраля 2012, 20:42 [#2]:Вот что интересно. 
 echo $allbalance - $balance; // выдает 2.12 Ну в принципе проблема решается округлением до сотых, т.к. расчеты связаны с деньгами. Или так:
 
 
 if ($allpayout*1000!=$allbalance*1000 - $balance*1000){
  echo "user_id=$user_id; не прошёл контроль $allpayout<>$allbalance-$balance";
} |  
|   | Ерёмин А.А. (статус: *Администратор), 9 февраля 2012, 13:08 [#3]: Цитата (VKHacker): проблема решается округлением до сотых, т.к. расчеты связаны с деньгами Да, считать тысячные доли копеек — это странновато
  Хотя все мы знаем случай в истории, когда на этом сколотили состояние. 
 Цитата (VKHacker): if ($allpayout*1000!=$allbalance*1000 - $balance*1000){ Криво и ненадёжно, мало ли какая там мантисса будет.
 |  
|   | mirt.steelwater (статус: Посетитель), 10 февраля 2012, 18:09 [#4]:храни сууму в милионных долях копеек, назови эту величину - ломаный грош (10E-9 руб. = ломаный грош) складывай и вычитай ломаные гроши, а когда нужно показать сумму - дели их на соотв. степень десятки
 Ⓐ свобода сопротивление солидарность |  
|   | bugmenot (статус: 3-ий класс), 10 февраля 2012, 21:25 [#5]: Цитата (mirt.steelwater): милионных долях копеек, назови эту величину - ломаный грош (10E-9 руб Нанорубль тогда уж. Хотя уже порядок потерял, миллионная доля копейки != 10-9. Предлагаю внесистемную единицу - 1 чубайс
 виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  
|   | Кириченко Сергей (статус: 1-ый класс), 11 февраля 2012, 04:37 [#6]:сравнивай строки. $ballanceDiff = ''.$ballanceDiff =$allbalance - $balance;
 $allpayout = ''.$allpayout
 if($allpayout!=$ballanceDiff){
 echo "user_id=$user_id; не прошёл контроль $allpayout<>$allbalance-$balance";
 }
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |