Domanda

Devo confrontare la parte intera di due doppi per la disuguaglianza e attualmente sto facendo questo:

int iA = (int)dA;
int iB = (int)dB;

if( iA != iB )
{
    ...
}

ma mi chiedo se esiste un approccio migliore di questo.

Grazie.

Se avessi usato Math.Truncate () invece di un cast per int, sarebbe comunque accurato confrontare i due doppi valori risultanti per l'uguaglianza?

Informazioni sui commenti della notazione ungherese:

Non uso mai HN da solo, non almeno nel modo in cui la maggior parte delle persone lo fa. Ma questo è uno di questi rari casi in cui la semantica di una variabile si riferisce direttamente al suo tipo. Avrei potuto scegliere un'altra sintassi come A_As_Integer e B_As_NonInteger ma quale sarebbe stata la differenza allora?

È stato utile?

Soluzione

Usa Math.Truncate () cioè

if (Math.Truncate(x) == Math.Truncate(y))

[Modifica] Realizzato che se si stanno confrontando parti intere di doppi, il casting in valori int prima corre il rischio di overflow se i doppi si trovano al di fuori dell'intervallo che potrebbe essere rappresentato come int.

Troncato restituisce un decimale o un doppio, evitando questo problema.

Altri suggerimenti

Sì, questo è l'approccio migliore.

Supponendo dalla tua formulazione nella tua domanda non sei preoccupato di arrotondare ... solo la parte integerr stessa.

es. (int) 4.1 darà lo stesso risultato di (int) 4.9

Come affermato da Ovidio, se hai solo bisogno delle variabili per il confronto, dovrai solo lanciare i doppi nell'istruzione di confronto. Stavo guardando solo la teoria.

Personalmente, cerco di evitare di creare variabili extra se non ne ho bisogno.

if ( (int)dA != (int)dB ) {
    ...
}

Man mano che il codice si evolve nel tempo, avere variabili extra in sospeso senza scopo crea confusione. Naturalmente, se hai bisogno di quelle variabili, questo è un altro problema :)

Nota a margine: sembra che tu stia provando a suggerire il tipo di dati tramite una semplice notazione ungherese. Posso raccomandare di non farlo? Se è necessario aggiungere un prefisso alle informazioni sulle variabili, provare a aggiungere il prefisso a cosa serve la variabile, piuttosto che il suo tipo. Se lo fai, gli errori nel codice possono essere più facili da vedere:

if ( (int)ageA != (int)idB ) {
    ...
}

In questo caso, senza nemmeno sapere quali siano i dati, vedere che stai cercando di confrontare un 'età' con un 'id' è un buon indizio del fatto che qualcosa non va qui.

Sono d'accordo che Troncare è quello che vuoi.

Alcune informazioni utili da MSDN :

Tronca restituisce il numero che rimane dopo che le cifre frazionarie sono state scartate.

Arrotonda al numero intero più vicino verso zero.

double floatNumber;

floatNumber = 32.7865;
// Displays 32      
Console.WriteLine(Math.Truncate(floatNumber));

floatNumber = -32.9012;
// Displays -32       
Console.WriteLine(Math.Truncate(floatNumber));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top