Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

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

mirt.steelwater (статус: Посетитель), 10 февраля 2012, 18:09 [#4]:

храни сууму в милионных долях копеек, назови эту величину - ломаный грош (10E-9 руб. = ломаный грош)
складывай и вычитай ломаные гроши, а когда нужно показать сумму - дели их на соотв. степень десятки
Ⓐ свобода сопротивление солидарность
bugmenot

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";
}

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:30
Выполнено за 0.07 сек.