2012-04-07 26 views
16

Necesito obtener la parte decimal de un número flotante, por ejemplo:Obtener la parte decimal de un número flotante

float x = 18.30;

i necesita una manera de obtener el' 0,30' en otro flotador .. así que voy a tener un flotador es igual a 18.30 y otro es igual a 0,30

¿Alguna idea?

+2

qué quiere HOQF (18.30, 1.0)? – gbulmer

+1

O simplemente 'y1 = (int) x; y2 = x - y1; ', aunque se pone tictac con números negativos, según tu intención. –

+1

@gbulmer bien, fmodf .... – lnafziger

Respuesta

20

no estoy seguro de si hay una función haciendo exactamente de la manera deseada, pero se puede usar esto:

x - floor(x) 
+0

Tenga en cuenta que esto podría ser, o no, lo que espera para x = - 18.3 –

1

Hay una familia de funciones FMOD, por ejemplo, fmod (18.30, 1.0), fmodf (18.30, 1.0), etc

#include <stdio.h> 
#include <math.h> 

int main (int argc, const char * argv[]) { 
    // insert code here... 
    printf("%f\n", fmod(18.30, 1.0)); 
    return 0; 
} 
8

La función modf() hace esto más directamente que fmodf().

+0

Doh! Mi pobre y viejo cerebro :-) – gbulmer

17

La respuesta aceptada anteriormente (x - piso (x)) funciona para números positivos pero no es lo correcto para números negativos. Utilice trunc() en su lugar:

x - trunc(x) 

Pero la solución HOQF() es el que se debe usar si usted me pregunta:

fmod(x, 1) 
0

Nota: El uso modf o HOQF como se sugiere en otras respuestas.

Pero no espere tener exactamente el mismo número que atof ("0,30"), como sugiere su solicitud de igual a igual.

De hecho, sucede que atof ("18.30") es el float más cercano a atof ("18.0") + atof ("0.30"), pero esta operación no es exacta, tiene un error de redondeo, como cualquier suma de atof ("0.30") con un entero> 0.

Así que cuando restas la parte entera, no hay razón para encontrar atof ("0.30") de vuelta, solo encuentras algo cerca de atof ("0.30 ").

Expresado en Squeak/Pharo Smalltalk (doble precisión utilizado aquí)

(1 to: 100) count: [:i | 0.3 + i = (3/10+i) asFloat]. 

da

-> 100 

Pero:

(1 to: 100) count: [:i | (3/10+i) asFloat - i = 0.3]. 

da

-> 0 
0

x = 3.5

y = parseInt (3.5)

fraction_part = (x-y);

0

La mejor manera que he encontrado usando los tipos de variables de Objective-C es la siguiente:

CGFloat floatingPointNumber = 18.30; 
NSInteger integerNumber = floatingPointNumber; 
CGFloat floatingPointNumberWithoutTheInteger = floatingPointNumber - integerNumber; 

Los siguientes son el resultado cuando se ejecuta:

enter image description here

Cuestiones relacionadas