2012-07-10 6 views
8

Quiero saber si hay una función simple que pueda usar tal muestra. Tengo unRedondeando un número flotante en el objetivo-c

float value = 1.12345; 

quiero redondear con llamar algo así como

float value2 = [roundFloat value:value decimal:3]; 
NSLog(@"value2 = %f", value2); 

Y consigo "1.123" ¿Hay alguna Library o por defecto la función para la que o yo debería escribir un bloque de código para este tipo de cálculos?

agradecimiento por su ayuda de antemano

Respuesta

7

Usando NSLog(@"%f", theFloat) siempre las salidas de seis decimales, por ejemplo:

float theFloat = 1; 
NSLog(@"%f",theFloat); 

Salida:

1.000000 

En otras palabras, nunca se conseguirá mediante el uso de 1.123NSLog(@"%f", theFloat).

Cut-off después de tres decimales:

float theFloat = 1.23456; 
float newFLoat = (int)(theFloat * 1000.0)/1000.0; 
NSLog(@"%f",newFLoat); 

de salida:

1.234000 

redondo a tres decimales (utilizando roundf()/lroundf()/ceil()/floor()):

float theFloat = 1.23456; 
float newFLoat = (int)(roundf(theFloat * 1000.0))/1000.0; 
NSLog(@"%f",newFLoat); 

de salida :

1.235000 

Ronda a tres decimales (manera sucia):

float theFloat = 1.23456; 
NSString *theString = [NSString stringWithFormat:@"%.3f", theFloat]; 
float newFloat = [theString floatValue]; 
NSLog(@"%@",theString); 
NSLog(@"%f",newFloat); 

Salida:

1.235 
1.235000 
+0

'% f' no genera 6 decimales, redondea_ a 6 decimales. El valor del punto flotante real no es tan bonito. – Sulthan

+0

Esto solo funciona para ciertos valores que tienen representaciones exactas como fracciones binarias.No funciona en más del 90% de los casos. – EJP

-1

tratar

#import <math.h> 

float cutFloat(float number, int decimal) { 
    number = number*(pow(10,decimal)); 
    number = (int)number; 
    number = number/(pow(10,decimal)) ; 

    return number; 
} 
+0

esta solución no va a redondear el número . lo cortará en un lugar decimal específico. – nfarshchi

+0

Y ni siquiera hará eso correctamente en la mayoría de los casos. – EJP

3

Para imprimir el valor de uso:

NSLog(@"value2 = %.3f", value2);

Redondear a 3 dígitos decimales cálculos antes realmente no tiene sentido porque float no es un número preciso Incluso si lo redondea al 1.123, será algo así como 1.122999999998.

Reglas:

  1. lo general, se completan sólo para imprimir el resultado - formateador cadena puede manejarlo (véase más arriba).
  2. Para cálculos precisos (por ejemplo, moneda), no use coma flotante, use NSDecimalNumber o aritmética de punto fijo.
+0

Gracias por su ayuda, pero en esta muestra debería usar 'float' y también cualquier decimal adicional cometerá algún error en mi cálculo específico. pero gracias por su ayuda también – nfarshchi

+0

Probé NSDecimalNumber y eso también fue genial. gracias por tu sugerencia. +1 – nfarshchi

+1

@nfarshchi Esa declaración es una contradicción en los términos. * O bien * debe usar float * o * debe tener un número específico de decimales. Usted * no puede * tener ambas cosas: es una imposibilidad matemática. – EJP

0

Tenga en cuenta que "Ronda" no es necesariamente tan simple un tema como usted piensa. Por ejemplo

DIY Calculator: Rounding Algorithms 101 enumera 16 métodos diferentes para redondear un número.

Wikipedia:Rounding cubre una gran parte del mismo terreno

Y cplusplus tiene código fuente de un montón de Rounding Algorithms que son fáciles traducible a Objective-C

Cómo desea redondear dependerá del contexto de lo lo estas haciendo con los datos.

Y debo señalar que el desbordamiento de la pila ya tiene un números de punto plethora of other questions about rounding in objective-c

1

flotantes no tienen cifras decimales, que tienen posiciones binarias. Los números de la raíz decimal tienen decimales. No puede redondear números de coma flotante a números específicos de decimales a menos que convierta a una base decimal. Sin rutina, método, función, etc., devuelve un valor en coma flotante puede posiblemente llevar a cabo esta tarea.

0
//Your Number to Round (can be predefined or whatever you need it to be) 
float numberToRound = 1.12345; 

float min = ([ [[NSString alloc]initWithFormat:@"%.0f",numberToRound] floatValue]); 
float max = min + 1; 
float maxdif = max - numberToRound; 
if (maxdif > .5) { 
    numberToRound = min; 
}else{ 
    numberToRound = max; 
} 

//numberToRound will now equal it's closest whole number (in this case, it's 1) 
0

Aquí es una forma sencilla de hacerlo:

float numberToRound = 1.12345f; 
float remainder = numberToRound*1000.0f - (float)((int)(numberToRound*1000.0f)); 

if (remainder >= 0.5f) { 
    numberToRound = (float)((int)(numberToRound*1000.0f) + 1)/1000.0f; 
} 
else { 
    numberToRound = (float)((int)(numberToRound*1000.0f))/1000.0f; 
} 

Para un decimal arbitraria, sustituir 1000.0f en el código anterior con

float mult = powf(10.0f, decimal); 
Cuestiones relacionadas