- Notifications
You must be signed in to change notification settings - Fork397
Description
En la documentación en español de Python se traduce el operador//
y el términofloor division
comodivisión entera.
Creo que la traducción del término no es adecuada y para que se entienda los motivos que tengo, lo argumento a continuación.
Nota: para no crear confusión, en esta argumentación, me referiré con el término en inglésfloor division
. En el último punto expongo una serie de opciones que creo que ayudarían a eliminar el problema que creo que tiene esa traducción (obviamente se admiten sugerencias).
Definiciones
División entera
El concepto dedivisión entera implica que se cumple la siguiente igualdad:
Dividendo = divisor * cociente + resto
Teniendo en cuenta que:
- todos los términos seránnúmeros enteros
- el
divisor
no puede ser 0- y el
resto
estará comprendido en el rango(-divisor, divisor) (sin incluirlos, por eso el uso de paréntesis( )
y no corchetes[ ]
)
Para que se entiendan los ejemplos, la notación usada para la división es la siguiente:
Algunos tipos de división entera
Ladivisión entera engloba distintos resultados, todas las siguientes implementaciones son correctas (hay más) y tienen cabida dentro de la definición:
- floor division: en esta elsigno del resto coincide con elsigno del divisor. Para ello, el cociente de la división real se redondea al primer entero inferior poniendo como límite a menos infinito (aplicamos la función enterapiso,suelo ofloor) =>
math.floor(Dividendo / divisor)
=>int(Dividendo / divisor)
- división euclídea: en esta el resto es no negativo y menor estricto que el divisor,0 <= resto < |divisor| (
resto >= 0 and resto < abs(divisor)
)
- división truncada: en esta elsigno del resto coincide con elsigno del Dividendo. Para ello, la división termina en el momento en el que habría que sacar decimales, o lo que es lo mismo, truncando (despreciando la parte fraccionaria) =>
math.trunc(Dividendo / divisor)
=>int(Dividendo / divisor)
Como podemos ver, de base usar únicamentedivisión entera (sin ningún "apellido") a todas estas divisiones, resulta ambiguo, más que nada, porque todas son enteras. Es necesario especificar a qué tipo nos referimos. De usar una sin especificar el tipo, parece más razonable que ladivisión entera fuera la última presentada (división truncada), porque en ella, al realizar la división a mano, no es necesario hacer ninguna operación extra para modificar ni el cociente, ni el resto, sale de forma natural al parar la división antes de obtener la parte fraccionaria.
"División entera" en la programación
En algunos lenguajes (no en Python)
En C
#include<stdio.h>intmain(){printf(" 7 // 2 = %2d\t 7 %% 2 = %2d\n",7 /2,7 %2);printf(" 7 // -2 = %2d\t 7 %% -2 = %2d\n",7 /-2,7 %-2);printf("-7 // 2 = %2d\t-7 %% 2 = %2d\n",-7 /2,-7 %2);printf("-7 // -2 = %2d\t-7 %% -2 = %2d\n",-7 /-2,-7 %-2);return0;}
En C++
#include<iomanip>#include<iostream>usingnamespacestd;intmain(){ cout <<" 7 // 2 =" <<setw(2) <<7 /2 <<"\t 7 % 2 =" <<setw(2) <<7 %2 << endl; cout <<" 7 // -2 =" <<setw(2) <<7 / -2 <<"\t 7 % -2 =" <<setw(2) <<7 % -2 << endl; cout <<"-7 // 2 =" <<setw(2) << -7 /2 <<"\t-7 % 2 =" <<setw(2) <<-7 %2 << endl; cout <<"-7 // -2 =" <<setw(2) << -7 / -2 <<"\t-7 % -2 =" <<setw(2) <<-7 % -2 << endl;return0;}
En Bash
echo -e" 7 // 2 =`expr 7 / 2` \t 7 % 2 =`expr 7 % 2`"echo -e" 7 // -2 =` expr 7 / -2` \t 7 % -2 =`expr 7 % -2`"echo -e"-7 // 2 =` expr -7 / 2` \t-7 % 2 =` expr -7 % 2`"echo -e"-7 // -2 =`expr -7 / -2` \t-7 % -2 =` expr -7 % -2`"
En Java
publicclassMain{publicstaticvoidmain(String[]args) {System.out.println(" 7 // 2 = " + (7 /2) +"\t 7 % 2 = " + (7 %2));System.out.println(" 7 // -2 = " + (7 / -2) +"\t 7 % -2 = " + (7 % -2));System.out.println("-7 // 2 = " + (-7 /2) +"\t-7 % 2 = " + (-7 %2));System.out.println("-7 // -2 = " + (-7 / -2) +"\t-7 % -2 = " + (-7 % -2)); }}
En PHP
<?phpecho" 7 // 2 =" .intdiv(7,2) ."\t 7 % 2 =" . (7 %2) ."\n";echo" 7 // -2 =" .intdiv(7, -2) ."\t 7 % -2 =" . (7 % -2) ."\n";echo"-7 // 2 =" .intdiv(-7,2) ."\t -7 % 2 =" . (-7 %2) ."\n";echo"-7 // -2 =" .intdiv(-7, -2) ."\t -7 % -2 =" . (-7 % -2) ."\n";
En Pascal
program Prueba;begin writeln (' 7 // 2 =',7div2,''#9' 7 % 2 =',7mod2); writeln (' 7 // -2 =' ,7div -2,''#9' 7 % -2 =',7mod -2); writeln ('-7 // 2 =' , -7div2,''#9'-7 % 2 =' ,-7mod2); writeln ('-7 // -2 =', -7div -2,''#9'-7 % -2 =' ,-7mod -2);end.
En todos estos lenguajes de programación (o de comandos, según el caso) la salida del programa es (en esta salida//
representa a la división truncada (hacia 0) y%
al módulo):
7 // 2 = 3 7 % 2 = 1 7 // -2 = -3 7 % -2 = 1-7 // 2 = -3 -7 % 2 = -1-7 // -2 = 3 -7 % -2 = -1
Es decir, en todos los ejemplos puestos, todos realizan la"división entera" comodivisión truncada.
En Python
En cambio en Python (a partir de la versión 2.2pep-0238/, versión en la que se crea el operador//
) el código usando el dicho operador (//
) y el del módulo (%
) (que siempre es coherente con la división aplicada), sería el que sigue:
En Python
print (' 7 // 2 = ',7//2,'\t 7 % 2 = ',7%2)print (' 7 // -2 =' ,7//-2,'\t 7 % -2 =' ,7%-2)print ('-7 // 2 =' ,-7//2,'\t-7 % 2 = ',-7%2)print ('-7 // -2 = ',-7//-2,'\t-7 % -2 =' ,-7%-2)
Y la salida es la siguiente:
7 // 2 = 3 7 % 2 = 1 7 // -2 = -4 7 % -2 = -1-7 // 2 = -4 -7 % 2 = 1-7 // -2 = 3 -7 % -2 = -1
En este caso Python realiza la "división entera" comofloor division.
Con esto no quiero decir que no haya más lenguajes que utilicen este criterio para la "división entera", ni que sea o no un buen criterio para el operador, simplemente que al traducirlo como "división entera", a los que vienen de alguno de los lenguajes que he comentado, la confusión está casi garantizada.
Seguimos en Python (bibliotecadecimal
)
En la bibliotecadecimal tenemos que el operador//
y%
funcionan de forma distinta. Pego un extracto de la documentación de dicha biblioteca:
Es decir, que el siguiente código en Python:
fromdecimalimportDecimalprint ('Decimal( 7) // Decimal( 2) = ',Decimal(7)//Decimal(2),'\tDecimal( 7) % Decimal( 2) = ',Decimal(7)%Decimal(2))print ('Decimal( 7) // Decimal(-2) =' ,Decimal(7)//Decimal(-2),'\tDecimal( 7) % Decimal(-2) = ',Decimal(7)%Decimal(-2))print ('Decimal(-7) // Decimal( 2) =' ,Decimal(-7)//Decimal(2),'\tDecimal(-7) % Decimal( 2) =' ,Decimal(-7)%Decimal(2))print ('Decimal(-7) // Decimal(-2) = ',Decimal(-7)//Decimal(-2),'\tDecimal(-7) % Decimal(-2) =' ,Decimal(-7)%Decimal(-2))
Produce esta salida:
Decimal( 7) // Decimal( 2) = 3 Decimal( 7) % Decimal( 2) = 1Decimal( 7) // Decimal(-2) = -3 Decimal( 7) % Decimal(-2) = 1Decimal(-7) // Decimal( 2) = -3 Decimal(-7) % Decimal( 2) = -1Decimal(-7) // Decimal(-2) = 3 Decimal(-7) % Decimal(-2) = -1
La misma salida que producen en otros lenguajes, es decir, comodivisión truncada.
Lo cual hace todavía más confuso usar de nuevo "división entera" para el mismo operador.
Resumen
- A las personas que aprenden a programar antes que en Python en alguno (y más) de los lenguajes que he comentado arriba, el hecho de leer en la documentación en español el termino "división entera" como traducción de "floor division" o
//
, lleva directamente a equívoco. Seguramente hasta que no vea que no funciona como espera, no se va a percatar de que realmente se trata de un operador distinto al que está acostumbrado. - En la documentación en inglés no existe esta ambigüedad, porque directamente al operador lo llaman
floor division
, quedando bien claro qué hace. - Existe ambigüedad si usamos dentro de Python el mismo nombre para el operador usado entre objetos decimal o entre enteros (y flotantes).
Propuesta
- Cambiar la traducción del término
floor division
y del operador//
en uncontexto distinto de la bibliotecadecimal
por una de las siguientes opciones (se admiten sugerencias):
- división piso o suelo (no las separaría, porque creo que dependiendo de la zona del lector se entiende mejor uno u otro)
- división a la baja (redondeado a la baja)
- división entera a la baja
- ...
- Cambiar la traducción del término
floor division
y del operador//
en elcontexto de la bibliotecadecimal
por una de las siguientes opciones (se admiten sugerencias):
- división truncada
- división entera truncada
- ...
- Añadir la traducción del término
floor division
y del operador//
a lamemoria de traducción (añadiendo la distinción de cuando se traduce en la bibliotecadecimal
o en otros contextos.
Bueno, creo que ya está bien XD.
Gracias si has llegado hasta aquí XD