Risposta diversa quando si converte un doppio in un Int - Java vs .Net
Domanda
In C # se voglio convertire un doppio (1.71472) in un int allora ottengo la risposta 2. Se lo faccio in Java usando il metodo intValue (), ottengo 1 come risposta.
Java arrotonda per difetto le conversioni?
Perché i documenti API Java hanno informazioni così scarse sulle loro classi, ad esempio
Restituisce il valore dell'oggetto specificato numero come int. Ciò può comportare arrotondamento o troncamento.
Un po 'più di informazioni sull'arrotondamento sarebbe stato utile!
Soluzione
Java viene arrotondato a zero quando si restringe da un punto mobile a un tipo intero & # 8212; e così fa C #, quando si utilizza la conversione di cast. È Convert.ToInt32
che arrotonda:
double d = 1.71472;
int x = (int) d; // x = 1
int y = Convert.ToInt32(d); // y = 2
I dettagli sono disponibili nelle Specifiche del linguaggio Java . Si noti che mentre la documentazione citata in Number
lascia aperte le opzioni per le sottoclassi, la documentazione sui tipi di boxe concreti, come Double
, è esplicito sull'implementazione:
Restituisce il valore di questo doppio come un int (eseguendo il casting per digitare int).
Quando si utilizza BigDecimal
, puoi specificare una delle otto diverse politiche di arrotondamento.
Altri suggerimenti
Java arrotonda verso zero quando si restringe da un punto mobile a un tipo intero.
C'è più documentazione sulle regole generali nel Java Language specifiche . Si noti che mentre la documentazione in Number
lascia aperte le opzioni per le sottoclassi, la documentazione sui tipi di boxe concreti è più esplicita:
Restituisce il valore di questo doppio come un int (eseguendo il casting per digitare int).
Quando si utilizza BigDecimal , puoi specificare una delle otto diverse politiche di arrotondamento.
Jon Skeet è corretto, ma qualcos'altro da tenere presente è che .NET utilizza Banker's Rounding come algoritmo di arrotondamento. Quando sei a metà strada tra il round e il numero intero pari.