|
Вопрос # 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";
}
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|