Alguém sabe por que a divisão inteira em C # retorna um número inteiro e não um float? Qual é a ideia por trás disso? (É apenas um legado de C / C ++?)
Em c #:
float x = 13 / 4;
//== operator is overridden here to use epsilon compare
if (x == 3.0)
print 'Hello world';
O resultado desse código seria:
'Hello world'
A rigor, não existe divisão inteira (divisão por definição é uma operação que produz um número racional, os números inteiros são um subconjunto muito pequeno).
integer
divisão, nãofloating point
divisão.Respostas:
Embora seja comum o novo programador cometer esse erro de executar a divisão inteira quando na verdade pretendia usar a divisão de ponto flutuante, na prática real a divisão inteira é uma operação muito comum. Se você está assumindo que as pessoas raramente o usam e que toda vez que faz uma divisão, sempre precisará se lembrar de lançar pontos flutuantes, está enganado.
Primeiro, a divisão inteira é um pouco mais rápida; portanto, se você precisar apenas de um resultado com um número inteiro, é recomendável usar o algoritmo mais eficiente.
Em segundo lugar, existem vários algoritmos que usam divisão inteira e, se o resultado da divisão sempre foi um número de ponto flutuante, você seria forçado a arredondar o resultado toda vez. Um exemplo em cima da minha cabeça é mudar a base de um número. O cálculo de cada dígito envolve a divisão inteira de um número junto com o restante, em vez da divisão de ponto flutuante do número.
Devido a esses (e outros motivos relacionados), a divisão inteira resulta em um inteiro. Se você deseja obter a divisão de ponto flutuante de dois números inteiros, basta lembrar de converter um em
double
/float
/decimal
.fonte
/
operador executará divisão de número inteiro ou de ponto flutuante (a menos que você esteja usando dinâmico). Se é difícil para você descobrir isso, porque você está fazendo tanto em que uma linha, então eu sugiro que quebrar essa linha-se em várias linhas de modo que é mais fácil de descobrir se os operandos são inteiros ou tipos de ponto flutuante. Os futuros leitores do seu código provavelmente o apreciarão.int/int
operador era simplesmente ilegal [com um diagnóstico especificando que o código deve converter um operando ou usar o método outro operador, dependendo do comportamento desejado]. Se houvesse alguma outra boa sequência de tokens disponível para a divisão de números inteiros, talvez fosse possível descontinuar o uso/
dessa finalidade, mas não sei o que seria prático.Consulte a especificação C # . Existem três tipos de operadores de divisão
No seu caso, temos a divisão Inteiro, com as seguintes regras aplicadas:
Eu acho que a razão pela qual o C # usa esse tipo de divisão para números inteiros (algumas línguas retornam resultado flutuante) é o hardware - a divisão de números inteiros é mais rápida e mais simples.
fonte
Cada tipo de dados é capaz de sobrecarregar cada operador. Se o numerador e o denominador forem números inteiros, o tipo inteiro executará a operação de divisão e retornará um tipo inteiro. Se você deseja divisão de ponto flutuante, deve converter um ou mais números para tipos de ponto flutuante antes de dividi-los. Por exemplo:
ou, se você estiver usando literais:
Lembre-se de que os pontos flutuantes não são precisos. Se você se preocupa com precisão, use algo como o tipo decimal.
fonte
Como você não usa nenhum sufixo, os literais
13
e4
são interpretados como número inteiro:Assim, como você declara
13
como inteiro, a divisão inteira será realizada:E assim ocorre o arredondamento:
Se você fizer o seguinte:
Você receberá um erro do compilador, pois uma divisão de ponto flutuante (o
/
operador de13f
) resulta em um ponto flutuante, que não pode ser convertido para int implicitamente.Se você deseja que a divisão seja uma divisão de ponto flutuante, terá que transformar o resultado em flutuante:
Observe que você ainda dividirá números inteiros, que serão implicitamente convertidos para flutuar: o resultado será
3.0
. Para declarar explicitamente os operandos como flutuante, usando of
sufixo (13f
,4f
).fonte
1.0
.É apenas uma operação básica .
Lembre-se de quando você aprendeu a dividir. No começo nós resolvemos
9/6 = 1 with remainder 3
.O operador / em combinação com o operador% é usado para recuperar esses valores.
fonte
Pode ser útil:
fonte
2.5
, não2
.O resultado será sempre do tipo que possui o maior intervalo do numerador e do denominador. As exceções são byte e short, que produzem int (Int32).
Não há conversão implícita entre os tipos de ponto flutuante e o tipo decimal; portanto, a divisão entre eles não é permitida. É necessário converter e decidir explicitamente qual você deseja (o Decimal tem mais precisão e um intervalo menor comparado aos tipos de ponto flutuante).
fonte