|
число 216 оказалось меньше 216.00. Как?
|
|||
---|---|---|---|
#18+
всем привет на сервере php 7.0.24 в системе биллинга есть проверка суммы на счету и если сумма достаточная для списания - она списывается но пару дней назад алгоритм выдал вообще непонятную картину: Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
собственно в логах вот что: 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2017, 12:48 |
|
число 216 оказалось меньше 216.00. Как?
|
|||
---|---|---|---|
#18+
kolio216.00 это отформатированное внешнее представление внутри может оказаться что-то типа 215.9998 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2017, 13:04 |
|
число 216 оказалось меньше 216.00. Как?
|
|||
---|---|---|---|
#18+
колонка, по которой считается сумма в MYSQL val double(10,2) дело в том, что там в данном случае суммы типа: 10.00 -10.00 162.00 -162.00 216.00 формат специально для того, чтобы хранить копейки до 2го знака а как лучше тогда сравнить эти 2 числа? я имею ввиду, чтобы они обе могли быть с копейками. Копейки типа .9999 не интересуют. Вполне хватит точности до .99 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2017, 13:13 |
|
число 216 оказалось меньше 216.00. Как?
|
|||
---|---|---|---|
#18+
Используй DECIMAL + http://de2.php.net/manual/en/ref.bc.php ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2017, 13:17 |
|
число 216 оказалось меньше 216.00. Как?
|
|||
---|---|---|---|
#18+
koliodouble(10,2) kolioформат специально для того, чтобы хранить копейки до 2го знака храниться всё равно будет плавающее IEEE 754 double ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2017, 13:40 |
|
число 216 оказалось меньше 216.00. Как?
|
|||
---|---|---|---|
#18+
переделал в DECIMAL 10,2 и нашел простой способ сравнения с сайта: http://php.net/manual/ru/language.types.float.php Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9.
как вариант сделать Код: php 1. 2. 3.
условно говоря нужно 200 - на счету 100 = 100. А 100 больше 0.00001 - значит не хватает ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2017, 13:46 |
|
число 216 оказалось меньше 216.00. Как?
|
|||
---|---|---|---|
#18+
или вот еще пацан один написал: $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. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2017, 13:48 |
|
число 216 оказалось меньше 216.00. Как?
|
|||
---|---|---|---|
#18+
Кого интересуют "нормальные" способы решения, а не костыли, можно взять что-то вроде этого https://github.com/brick/math ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2017, 21:45 |
|
|
start [/forum/topic.php?fid=23&fpage=29&tid=1460471]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
28ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 315ms |
total: | 436ms |
0 / 0 |