Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Traducción del operador // (floor division) al español #2754

Closed
@jcaalzago

Description

@jcaalzago

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
  • eldivisor no puede ser 0
  • y elresto 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:
imagen

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)
Ejemplos de división "floor division"

imagen

  • 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))
Ejemplos de división euclídea

imagen

  • 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)
Ejemplos de división truncada

imagen

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:
imagen

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 llamanfloor 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

  1. Cambiar la traducción del términofloor 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
  • ...
  1. Cambiar la traducción del términofloor 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
  • ...
  1. Añadir la traducción del términofloor 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions


      [8]ページ先頭

      ©2009-2025 Movatter.jp