¿Alguien sabe por qué la división de enteros en C # devuelve un entero y no un flotante? ¿Cuál es la idea detrás de esto? (¿Es solo un legado de C / C ++?)
C ª#:
float x = 13 / 4;
//== operator is overridden here to use epsilon compare
if (x == 3.0)
print 'Hello world';
El resultado de este código sería:
'Hello world'
Estrictamente hablando, no existe una división entera (la división por definición es una operación que produce un número racional, los enteros son un subconjunto muy pequeño de los cuales).
integer
división, nofloating point
división.Respuestas:
Si bien es común que el nuevo programador cometa este error de realizar la división de enteros cuando en realidad pretendían usar la división de punto flotante, en la práctica la división de enteros es una operación muy común. Si asumes que la gente rara vez lo usa, y que cada vez que haces una división, siempre necesitarás recordar lanzar a puntos flotantes, estás equivocado.
En primer lugar, la división de enteros es bastante más rápida, por lo que si solo necesita un resultado de número entero, uno querría usar el algoritmo más eficiente.
En segundo lugar, hay varios algoritmos que usan la división de enteros, y si el resultado de la división siempre fue un número de coma flotante, se vería obligado a redondear el resultado cada vez. Un ejemplo fuera de mi cabeza es cambiar la base de un número. Calcular cada dígito implica la división entera de un número junto con el resto, en lugar de la división de coma flotante del número.
Debido a estas (y otras razones relacionadas), la división de enteros resulta en un entero. Si desea obtener la división de coma flotante de dos enteros, solo deberá recordar lanzar uno a
double
/float
/decimal
.fuente
/
operador realizará una división entera o de coma flotante (a menos que esté usando dinámica). Si es difícil para usted descubrirlo porque está haciendo mucho en esa línea, le sugiero dividir esa línea en varias líneas para que sea más fácil averiguar si los operandos son enteros o de tipo coma flotante. Los futuros lectores de su código probablemente lo apreciarán.int/int
operador era simplemente ilegal [con un diagnóstico que especifica que el código debe emitir un operando o usar el otro operador, dependiendo del comportamiento deseado]. Si hubiera alguna otra buena secuencia de tokens disponible para la división de enteros, podría ser posible desaprobar el uso de/
ese propósito, pero no sé qué sería práctico.Ver la especificación de C # . Hay tres tipos de operadores de división.
En su caso tenemos la división Integer, con las siguientes reglas aplicadas:
Creo que la razón por la que C # usa este tipo de división para enteros (algunos lenguajes devuelven resultados flotantes) es el hardware: la división de enteros es más rápida y sencilla.
fuente
Cada tipo de datos es capaz de sobrecargar a cada operador. Si tanto el numerador como el denominador son enteros, el tipo entero realizará la operación de división y devolverá un tipo entero. Si desea la división de coma flotante, debe emitir uno o más números a tipos de coma flotante antes de dividirlos. Por ejemplo:
o, si está usando literales:
Tenga en cuenta que los puntos flotantes no son precisos. Si te importa la precisión, usa algo como el tipo decimal, en su lugar.
fuente
Como no utiliza ningún sufijo, los literales
13
y4
se interpretan como enteros:Por lo tanto, dado que declaras
13
como entero, se realizará la división de enteros:Y así ocurre el redondeo:
Si haces lo siguiente:
Recibirá un error del compilador, ya que una división de punto flotante (el
/
operador de13f
) da como resultado un flotante, que no se puede convertir a int implícitamente.Si desea que la división sea una división de punto flotante, deberá hacer que el resultado sea flotante:
Tenga en cuenta que aún dividirá enteros, que se convertirán implícitamente en flotantes: el resultado será
3.0
. Para declarar explícitamente los operandos como flotantes, utilizando elf
sufijo (13f
,4f
).fuente
1.0
.Es solo una operación básica .
Recuerda cuando aprendiste a dividir. Al principio lo resolvimos
9/6 = 1 with remainder 3
.El / operador en combinación con el% operador se utilizan para recuperar esos valores.
fuente
Puede ser útil:
fuente
2.5
, no2
.El resultado siempre será del tipo que tenga el mayor rango del numerador y el denominador. Las excepciones son byte y short, que producen int (Int32).
No existe una conversión implícita entre los tipos de coma flotante y el tipo decimal, por lo que no se permite la división entre ellos. Debe emitir y decidir explícitamente cuál desea (Decimal tiene más precisión y un rango más pequeño en comparación con los tipos de punto flotante).
fuente