我正在try 制作一种算法,该算法将根据以下条件进行循环:

  • 1或2美分-向下舍入为"0"
  • 3美分或4美分-向上舍入到5美分
  • 5美分--还剩5美分
  • 6或7美分--四舍五入至5美分
  • 8或9美分-向上舍入为"0"

因此,它应该如下所示:

PRICE| AFTER
9.90 | 9.90
9.91 | 9.90
9.92 | 9.90
9.93 | 9.95
9.94 | 9.95
9.95 | 9.95
9.96 | 9.95
9.97 | 9.95
9.98 | 10.0
9.99 | 10.0
10.0 | 10.0

我的代码在这里,但看起来很奇怪. 对于类似10.99的数字,结果变为10.10:

 function roundDown(float $price): float
    {
        [$number, $decimals] = explode('.', sprintf('%.2f', $price));
        [, $second] = str_split($decimals);

        $table = [
            0 => 0,
            1 => -1,
            2 => -2,
            3 => 2,
            4 => 1,
            5 => 0,
            6 => -1,
            7 => -2,
            8 => 2,
            9 => 1,
        ];

        return $number . '.' . str_pad((float)$decimals+(float)$table[$second], 2, '0', STR_PAD_LEFT);
    }

先谢谢你.

推荐答案

这个怎么样?

function roundDown(float $price): float
{
    $denominator = 20;

    return round(round($price * $denominator) / $denominator, 2, PHP_ROUND_HALF_UP);
}

Php相关问答推荐

为什么PHP输出\n而不是实际创建一个新元素?

在WooCommerce Checkout帐单地址字段后插入自定义按钮

管理员订单列表中的自定义列与WooCommerce 8.6.1一起消失

我如何知道BaseController中当前运行的是哪个控制器?

WooCommerce产品按特定元数据的自定义数字排序选项

多行PHP属性声明中是否允许单行注释

添加并显示单价字段到WooCommerce产品变化

Symfony Validator:如何使用XML表示法验证深度嵌套的数据?

从字符串转换日期和/或时间时,Laravel转换失败

如果WooCommerce购物车在 checkout 时被清空,请重定向至store 页面

如何使用 AJAX、PHP 和 MYSQL 在 Select 项目时在文本框中填充数据

调用未定义的方法 mysqli::execute_query()

Google Drive API:为什么使用服务帐户在下载文件时会将我带到 Google Drive 登录窗口?

在特征中使用类的属性

Laravel Eloquent:复杂的多对多关系以及缺失关系的默认值

htaccess Rewriterule 无法以任何方式工作

Laravel auth()->id() 在生产服务器中不工作

在 Laravel、Vuejs 和 Inertia 中配置 TypeScript 的问题

使用 Process facade 在外部 Laravel 项目上运行 Artisan 命令会返回主项目的数据库错误

Php 的新WeakMap - 枚举曾经被垃圾收集过吗?