Si usted tiene una división entera de números positivos que se redondea hacia cero, a continuación, puede agregar una unidad menor que el divisor al dividendo para que sea redondear al alza.
Es decir, reemplace X/Y
con (X + Y - 1)/Y
.
Prueba:
Caso 1: X = k * Y
(X es un número entero múltiplo de Y): En este caso, tenemos (k * Y + Y - 1)/Y
, que se divide en (k * Y)/Y + (Y - 1)/Y
. La pieza (Y - 1)/Y
redondea a cero, y nos queda un cociente de k
. Esto es exactamente lo que queremos: cuando las entradas son divisibles, queremos que el cálculo ajustado siga produciendo el cociente exacto correcto.
Caso 2: X = k * Y + m
donde 0 < m < Y
(X no es un múltiplo de Y). En este caso, tenemos un numerador de k * Y + m + Y - 1
, o k * Y + Y + m - 1
, y podemos escribir la división como (k * Y)/Y + Y/Y + (m - 1)/Y
. Desde 0 < m < Y
, 0 <= m - 1 < Y - 1
, por lo que el último término (m - 1)/Y
pasa a cero. Nos queda (k * Y)/Y + Y/Y
que funcionan hasta k + 1
. Esto muestra que el comportamiento se redondea. Si tenemos un X
que es un k
múltiplo de Y
, si le agregamos solo 1, la división redondea hasta k + 1
.
Pero este redondeo es extremadamente opuesto; todas las divisiones inexactas se alejan de cero. ¿Qué tal algo intermedio?
Esto se puede lograr "imprimando" el numerador con Y/2
. En lugar de X/Y
, calcule (X+Y/2)/Y
. En lugar de la prueba, vamos a ir empírica en este caso:
$ round()
> {
> echo $((($1 + $2/2)/$2))
> }
$ round 4 10
0
$ round 5 10
1
$ round 6 10
1
$ round 9 10
1
$ round 10 10
1
$ round 14 10
1
$ round 15 10
2
Siempre que el divisor es un par, número positivo, si el numerador es congruente con la mitad de ese número, se redondea hacia arriba, y redondea a la baja si se trata de uno menos que eso.
Por ejemplo, round 6 12
va a 1
, al igual que todos los valores que son iguales a 6
, módulo 12
, como 18
(que va a 2) y así sucesivamente. round 5 12
baja a 0
.
Para los números impares, el comportamiento es correcto. Ninguno de los números racionales exactos están a mitad de camino entre dos múltiplos consecutivos. Por ejemplo, con un denominador de 11
tenemos 5/11 < 5.5/11 (exact middle) < 6/11
; y round 5 11
redondea hacia abajo, mientras que round 6 11
redondea hacia arriba.
Esencialmente un paquete de actualización del SO 2.394.988 (http://stackoverflow.com/questions/2394988) - el mismo cartel. –
De acuerdo, es muy similar, pero yo no lo llamaría un DUP, pero siéntanse libres de cerrarlo ahora, ya que de todos modos he recibido mi respuesta, ¡gracias ghostdog! – Mint
de acuerdo! Las dos preguntas no son lo mismo. Uno está pidiendo techo. Este pide un redondeo que puede redondearse hacia arriba o hacia abajo. – shparekh