Сравнение значений, но с учетом отрицательных значений - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть $total и $balance.Баланс никогда не может быть больше общего, но ОБА может быть отрицательным.По сути, я пытаюсь понять, находится ли баланс между нулем и суммой.

Итак,

if (($total < 0 && $balance < $total) || ($total > 0 && $balance > $total)) { /** BAD **/ }

if (between($total < 0 ? $total : 0, $total < 0 ? 0 : $total, $balance) { /** BAD **/ }

Конечно, есть 2 способа добиться этого, но есть ли способ уменьшить количество логики здесь?Что-то «умное» в теории чисел, которое, я уверен, я должен знать ... но не знаю.

Я использую PHP, но принцип сравнения должен быть переведен с любого языка / алгоритма.

Отзыв от комментариев

Если сумма отрицательна, баланс должен быть отрицательным и не меньше, чем сумма.Если сумма положительная, баланс должен быть положительным и не превышать сумму

Может быть, картинка поможет!

Balance : BAD | Allowable -ve balances | Allowable +ve balances | BAD Total : -5 .. -4 .. -3 .. -2 .. -1 .. 0 .. 1 .. 2 .. 3 .. 4 .. 5

Дополнительная обратная связь

В вопросе «Баланс никогда не может быть больше, чем сумма, но ОБА может быть отрицательной» ... Я говорю о величине, а не о величине.Я не думаю, что ясно дал понять: https://study.com/academy/lesson/what-is-magnitude-definition-lesson-quiz.html

Решение

На основании предоставленных комментариев.

<?php

class RangeTest extends \PHPUnit\Framework\TestCase
{
    /**
     * @param int $balance
     * @param int $total
     * @param bool $expected
     *
     * @dataProvider provideRangeValues
     */
    public function testRange(int $balance, int $total, bool $expected)
    {
        $this->assertEquals((($total / abs($total)) * ($total - $balance) >= 0), $expected);
    }

    public function provideRangeValues()
    {
        return
            [
                'Positive Balance = Positive Total' => [10, 10, true],
                'Positive Balance < Positive Total' => [5, 10, true],
                'Positive Balance > Positive Total' => [10, 5, false],
                'Negative Balance = Negative Total' => [-10, -10, true],
                'Negative Balance < Negative Total' => [-5, -10, true],
                'Negative Balance > Negative Total' => [-10, -5, false],
            ];
    }
}

1 Ответ

0 голосов
/ 25 сентября 2018

Вы можете попробовать следующее:

if (  min(1, max(-1, $total)) * ($total - $balance) >= 0 ) {

   // all good 

Основано на комментариях OP , так как сумма никогда не может быть нулевой.Мы также можем сделать следующее:

if ( ($total/abs($total)) * ($total - $balance) >= 0 ) {

   // all good 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...