У меня есть $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],
];
}
}