2012-06-20 5 views
14

L'ho visto in diversi punti dove (int)someValue è stato impreciso e invece il problema richiedeva la funzione round(). Qual è la differenza tra i due?variabile cast alla funzione int vs round()

In particolare, se necessario, per C99 C. Ho anche visto lo stesso problema nei miei programmi durante la scrittura in Java.

+0

Un'altra cosa interessante che non ho mai sentito prima: "Arrotonda al più vicino è anche la modalità di arrotondamento IEEE predefinita." - https://randomascii.wordpress.com/2014/01/27/theres-only-four-billion-floatsso-test-them-all/ – cmp

risposta

14

In caso di colata un valore float/double a int, è generalmente ampio frazionata parte causa intero troncamento.

Questo è molto diverso da arrotondamento come ci si aspetterebbe, quindi per esempio 2,8 finisce come 2 con troncamento intero, proprio come 2.1 potrebbe finire come 2.

Aggiornamento:

altro fonte di potenziale (lordo) inesattezza con il casting è dovuto alla limitata gamma di valori che possono essere rappresentati con numeri interi rispetto a quelli in virgola mobile (grazie a @R che ci ricorda questo nel commento seguente)

+0

Non capisco perché questi problemi set (compeition o per l'online cs50 di harvard) usa round() e indica agli studenti in particolare di usare int in modo che arrotondino _down_. E 'abbastanza fastidioso, non credi? Comunque, grazie. – cmp

+1

Un altro problema con la trasmissione o la conversione implicita in un numero intero è che i valori di grande magnitudine vengono distrutti. Anche quando si desidera un risultato a numeri interi, è spesso preferibile mantenere un tipo a virgola mobile in modo da preservare i numeri di grandi dimensioni. Funzioni come 'round',' floor', 'rint', ecc. Possono farlo. –

+0

@r * eccellente * punto, l'intervallo di valori che può essere rappresentato è decisamente limitato con numeri interi. Penso che aggiungerò una nota a riguardo alla mia risposta. Grazie. – Levon

6
  1. La trasmissione a int tronca un numero in virgola mobile, ovvero, la parte frazionaria viene eliminata.
  2. La funzione round restituisce il numero intero più vicino. I casi a metà strada sono arrotondati da zero, ad esempio, round(-1.5) è -2 e round(1.5) è 2.

7.12.9.6 Le funzioni rotonde

Sinossi

#include <math.h> 
double round(double x); 
float roundf(float x); 
long double roundl(long double x); 

Descrizione

Le round funzioni rotonda loro tesi al neare st valore intero in formato a virgola mobile, arrotondando a metà strada i casi da da zero, indipendentemente dalla direzione di arrotondamento corrente.

ritorni

Le round funzioni restituiscono il valore intero arrotondato.

Fonte: lo standard C99 (ISO/IEC 9899:1999). Questa sezione non è cambiata nello standard C11 (ISO/IEC 9899:2011).

(Per coloro che sono interessati, here è una chiara introduzione agli algoritmi di arrotondamento.)

+1

Solo una nota, il comportamento di arrotondamento può variare da quello previsto e dalla lingua. Ad esempio, ho scoperto di recente che Python 3.x arrotonda verso il numero * pari * più vicino ... il che mi ha davvero buttato fuori. Quindi, è sempre bene controllare la documentazione. Credo che dai miei giorni di programmazione C il comportamento di C sia più in linea con le aspettative comuni. – Levon

+0

@Levon Interessante ... e spaventoso :) – kol

+0

Sì, mi ha sorpreso anche me. Si chiama "arrotondamento del banchiere". – Levon

1

particolare per C, è (probabilmente) vero nella maggior parte dei casi che i tronca colata, tuttavia, si dovrebbe sempre verificare l'esito per essere sicuro.

Il problema con il lancio è che può essere troncato o rotondo. Ciò che fa dipende in gran parte dal linguaggio di programmazione, marginalmente dallo specifico compilatore utilizzato. Il che significa che non esiste una regola generale per il risultato che si applicherà sempre.

Round() è utilizzato universalmente per generare un risultato simile all'arrotondamento matematico. C'è un caso limite che deve essere monitorato in modo specifico per 0,5, che a volte arrotonda al numero pari successivo.