比较值,但要考虑负值

时间:2018-09-25 12:49:52

标签: php algorithm numbers

我有一个$total和一个$balance。余额永远不能大于总数,但两者都可能为负。本质上,我试图查看余额是否在零和总数之间。

所以

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

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

当然有两种方法可以实现这一目标,但是有没有一种方法可以减少逻辑量呢?我确信我应该知道一些用数论“巧妙”的东西……但是不知道。

我正在使用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 :(得分:2)

您可以尝试以下操作:

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

   // all good 

基于OP's comments,因为合计永远不能为零。我们还可以执行以下操作:

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

   // all good