2015-05-03 15 views
8

favore potete aiutare a risolvere questo problema:volte arrotondamento numero non sono coerenti

round(30.5) 
[1] 30 
round(31.5) 
[1] 32 

voglio ottenere sempre 0,5 s verso l'alto o verso il basso. Qualsiasi soluzione

+0

'floor' o' ceiling'? – Khashaa

+0

Li conosco, non è dispiaciuto. Non abbiamo idea dei numeri, ma quando abbiamo 0.5s in dati, voglio ottenerli sempre in su o in giù – user1309

+3

arrotondare per pareggiare è una regola matematica di base – rawr

risposta

13

Questa è un'altra istanza di R-FAQ 7.31 (link to the FAQ on your device) ...... (link to the CRAN version). Se si desidera sempre che i numeri in virgola mobile vengano visualizzati da print.default come x.5 a "arrotondamento", è necessario aggiungere un po 'di "fuzz". Ho scelto quella quantità di fuzz per essere simile all'accuratezza con cui print.default visualizza solitamente i numeri.

> round(30.5 +0.00000001) 
[1] 31 

per rendere questo accada in una funzione:

> round.up <- function(x, digits=0) round(x+0.00000001, digits) 
> round.up(30.5) 

Si potrebbe anche riflettere questa:

> 31.5==31.50000000000000001 
[1] TRUE 
> 31.5==31.5000000000000001 
[1] TRUE 
> 31.5==31.500000000000001 
[1] TRUE 
> 31.5==31.50000000000001 
[1] FALSE 

> 31.50000000000001 
[1] 31.5 

> 31.50000001 
[1] 31.5 
> 31.50001 
[1] 31.50001 
+0

Grazie, puoi consigliare per round-down – user1309

+4

Calcolare l'operazione matematica a ''-'' –

+0

Grazie mille per il tuo aiuto – user1309

0

Una soluzione che non ha bisogno di una stampa in formato dipendente offset:

Per arrotondare sempre, utilizzare

ceiling(x - 0.5) 

per arrotondare sempre verso il basso, utilizzare

floor(x + 0.5)