PHP - 通过分布整数进行安全除法

PHP - Safe division by distributing whole numbers

提问人:Giedrius 提问时间:6/17/2023 最后编辑:Rohit GuptaGiedrius 更新时间:6/27/2023 访问量:67

问:

PHP 中是否有数学函数可以提供没有分数/十进制数的安全除法?这意味着它将尽可能平均地“分配”金额,但只能以整数形式分配。

一些例子:

10/3 = [4, 3, 3]

11/3 = [4, 4, 3]

50/2 = [25, 25]

51/2 = [26, 25]

40/5 = [8, 8, 8, 8, 8]

40/3 = [14, 13, 13]

这意味着应该给我三个值,并且40/3141313

PHP 数学

评论

0赞 Rinsad Ahmed 6/17/2023
你试过ceil和地板功能吗?
2赞 President James K. Polk 6/17/2023
10/3 = [4, 3, 3] 是什么意思?
1赞 Sammitch 6/17/2023
使用货币库:github.com/moneyphp/money

答:

-2赞 Koala Yeung 6/17/2023 #1

没有缺货的东西。您可以为它编写自己的函数。

function sdiv(int $dividend, int $divisor): array {
  $q = (int) floor($dividend / $divisor);
  $r = $dividend % $divisor;
  return array_merge(
    array_fill(0, $r, $q + 1),
    array_fill(0, $divisor - $r, $q),
  );
}

assert(sdiv(10, 3) === [4, 3, 3]);
assert(sdiv(11, 3) === [4, 4, 3]);
assert(sdiv(15, 4) === [4, 4, 4, 3]);
assert(sdiv(16, 4) === [4, 4, 4, 4]);
assert(sdiv(17, 4) === [5, 4, 4, 4]);
assert(sdiv(18, 4) === [5, 5, 4, 4]);

运行它,所有断言都应该通过。php -d zend.assertions=1 filename.php

评论

2赞 Rohit Gupta 6/21/2023
当有四个答案时,这将不起作用。如果您想要我的投票,请修复
0赞 Koala Yeung 6/27/2023
原来的帖子非常不清楚“安全划分”是什么意思。我的旧答案符合当时演示的输入和输出。我已经更新了我的答案以适应更新的问题。
1赞 kikon 6/22/2023 #2

由于目前还没有可行的解决方案,这里有一个:

这个问题似乎要求将一个整数拆分(分区)为一组数字,这些数字要么是 ,要么是 由于 ,拆分可以通过以下公式生成:snq1 = ceil(s/n)q2 = floor(s/n)q1 - q2 = 1

q1 * (s - q2 * n) + q2 * (q1 * n - s) = (q1 - q2) * s = s,

那是

s = n1 * q1 + n2 * q2,

使用 、 和n1 = s - q2 * n n2 = q1 * n - sn1 + n2 = (q1 - q2) * n = n

Php 函数:

function splitInt($s, $n) {
  $q = $s / $n;
  $q1 = ceil($q);
  $q2 = floor($q);
  $n1 =  $q1 * $n - $s;
  // the result is [$n1 x q1, ($n - $n1) x $q2]
  return array_pad(array_fill(0, $n1, $q1), $n, $q2);
}

例:

$res = splitInt(100, 7);
echo json_encode($res) . "\n";
$sum = array_sum($res);
$count = count($res);
echo "count = $count   sum = $sum\n\n";

[15,15,14,14,14,14,14]
count = 7   sum = 100

沙盒中的更多示例。