powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / число 216 оказалось меньше 216.00. Как?
8 сообщений из 8, страница 1 из 1
число 216 оказалось меньше 216.00. Как?
    #39544350
kolio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всем привет
на сервере php 7.0.24

в системе биллинга есть проверка суммы на счету и если сумма достаточная для списания - она списывается
но пару дней назад алгоритм выдал вообще непонятную картину:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
$db = JFactory::getdbo();
$query = 'select sum(val) from `billing` where waiting <> 1 and uid = 1234';
$db->setQuery($query);
$acc = $db->loadResult();//здесь возвращает балланс 216.00

if ($acc == '') $acc = 0;

$value = 216;//нужно было списать. Тут переменная четко 216

if ($acc < abs($value)) {
	//ВЫПОЛНИЛСЯ ЭТОТ КУСОК КОДА!!!!
}



собственно в логах вот что:
Subscription not free. WithdrawMoney. user #1234 subscription_id=3 sum = 216
NO MONEY. user #1234 subscription_id=3 sum = 216 balance = 216.00

это как? глюк PHP?
только, что выполнил этот кусочек кода отдельно - всё отработало нормально. То есть не вошло вовнутрь последнего IF
...
Рейтинг: 0 / 0
число 216 оказалось меньше 216.00. Как?
    #39544366
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolio216.00
это отформатированное внешнее представление
внутри может оказаться что-то типа 215.9998
...
Рейтинг: 0 / 0
число 216 оказалось меньше 216.00. Как?
    #39544378
kolio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
колонка, по которой считается сумма в MYSQL val double(10,2)
дело в том, что там в данном случае суммы типа:

10.00
-10.00
162.00
-162.00
216.00

формат специально для того, чтобы хранить копейки до 2го знака

а как лучше тогда сравнить эти 2 числа? я имею ввиду, чтобы они обе могли быть с копейками. Копейки типа .9999 не интересуют. Вполне хватит точности до .99
...
Рейтинг: 0 / 0
число 216 оказалось меньше 216.00. Как?
    #39544382
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используй DECIMAL + http://de2.php.net/manual/en/ref.bc.php
...
Рейтинг: 0 / 0
число 216 оказалось меньше 216.00. Как?
    #39544407
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
koliodouble(10,2)
kolioформат специально для того, чтобы хранить копейки до 2го знака

храниться всё равно будет плавающее IEEE 754 double
...
Рейтинг: 0 / 0
число 216 оказалось меньше 216.00. Как?
    #39544416
kolio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
переделал в DECIMAL 10,2

и нашел простой способ сравнения с сайта:
http://php.net/manual/ru/language.types.float.php

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;

if(abs($a-$b) < $epsilon) {
    echo "true";
}
?>



как вариант сделать
Код: php
1.
2.
3.
if (($value - $balance) > 0.00001 ) {
  //нехватает денег!
}



условно говоря нужно 200 - на счету 100 = 100. А 100 больше 0.00001 - значит не хватает
...
Рейтинг: 0 / 0
число 216 оказалось меньше 216.00. Как?
    #39544420
kolio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
или вот еще пацан один написал:

$x = 8 - 6.4; // which is equal to 1.6
$y = 1.6;
var_dump($x == $y); // is not true

PHP thinks that 1.6 (coming from a difference) is not equal to 1.6. To make it work, use round()

var_dump(round($x, 2) == round($y, 2)); // this is true

This happens probably because $x is not really 1.6, but 1.599999.. and var_dump shows it to you as being 1.6.
...
Рейтинг: 0 / 0
число 216 оказалось меньше 216.00. Как?
    #39544899
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кого интересуют "нормальные" способы решения, а не костыли, можно взять что-то вроде этого
https://github.com/brick/math
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / число 216 оказалось меньше 216.00. Как?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]