grabbing number after decimal

111 vues (au cours des 30 derniers jours)
Neesha
Neesha le 20 Août 2014
Commenté : Elena le 22 Fév 2022
Hi I have a dataset which has column 'specialNumber'. It has data like '1234.5, 9087.3...' and so on, I want to extract number after decimal. so for 1234.5 = 5 for example. How do i do that
  1 commentaire
Bart McCoy
Bart McCoy le 25 Juil 2018
The "fix" function is useful here, since it rounds toward 0. This is important when extracting the fractional part of a NEGATIVE number:
If value = pi, then "value - fix(value)" = 0.141592653589793
If value = -pi, then "value - fix(value)" = -0.141592653589793

Connectez-vous pour commenter.

Réponse acceptée

Star Strider
Star Strider le 20 Août 2014
If you know you will only have one number after the decimal, just use the rem function:
x = 1234.5;
d = 10*rem(x,1);
produces:
d =
5
  1 commentaire
Elena
Elena le 22 Fév 2022
how would you do this to for a number like 0.05120? I would only like to get the '05' value from this. (last two numbers after decimal)

Connectez-vous pour commenter.

Plus de réponses (5)

David Sanchez
David Sanchez le 20 Août 2014
N = 1234.5;
R = 10*(N-floor(N))
R =
5
  3 commentaires
Hikaru
Hikaru le 20 Août 2014
Modifié(e) : Hikaru le 20 Août 2014
@Patrik. This does not always work. If N = 1234.5, then your code will return R = 50
Plus, using round is better compared to floor because of the floating points.
Patrik Ek
Patrik Ek le 20 Août 2014
Modifié(e) : Patrik Ek le 20 Août 2014
@Hikaru It is true that R becomes 50 when there is only 1 decimal digit in the number. This is not a bug though, since the second digit indeed would be 0 if N is exactly 1234.5. If the accuracy of N is one digit (or if you only want the first decimal digit), it is still not a problem. Then you explicitely need to state that you do only want one digit and not 2 by setting nDigits=1. This is not an unreasonable approach, since this decision should really be the user's.
And about using round instead of floor I do not buy it. You solve a problem that is unlikely to happen, by creating a problem that will occur in 50% of all the cases. Assume that I would use round in my case; This would give the result R = 54, since round(53.7) is 54. This could possibly be a common case. However, since you do the operation N-floor(N), you are unlikely to get floating point errors. Focus on the real problem instead of obscure errors that will probably not occur anyway. An alternative could be you uploading a solution that is safe from floating point errors. To use round is not really a solution to the problem. It is just a workaround and in this case a workaround that does not work as intended.

Connectez-vous pour commenter.


Image Analyst
Image Analyst le 20 Août 2014
neesha, what if there are 3 or 4 numbers after the decimal point? Do you want only the first one, or all of them? What if you did
fractions = t.specialNumber - floor(t.specialNumber);
where t is the table and specialNumber is the column in the table. So for example 73.8234 would give 0.8234 as a result. Would that work for you? Or do you only want the 8 as 8 and not as 0.8 or 0.8234?

Hikaru
Hikaru le 20 Août 2014
Modifié(e) : Hikaru le 20 Août 2014
One way to do this
specialNumber = [1234.5; 9087.3];
d = abs(specialNumber - fix(specialNumber));
answer = d*10; %assuming that your data only has one decimal place
final = round(answer)
Note: This is not really the best solution since subtracting floating points can introduce error.
  1 commentaire
Patrik Ek
Patrik Ek le 20 Août 2014
Well I guess that you are quite safe from floating point errors here, since you you use the same variable. However, I think that a completely stable solution would cost more than you would gain. Floating point errors in operations like this is uncommon in matlab.

Connectez-vous pour commenter.


Patrik Ek
Patrik Ek le 20 Août 2014
Since there have been a discussion about floating point errors here (which IMO seems to be overkill to care about for this operation) I will provide an integer casting solution. This should be free from floating point issues since no addition or subtraction is done with floating points.
N = 1234.537;
nDigits = 2;
R = cast(floor(10^nDigits*N),'int32') - cast(10^nDigits*floor(N),'int32');
R = cast(R,'double') % If double is important then cast it back
The floor in the first term is there because of matlabs solution of casting, which rounds the double to closest int.

Neesha
Neesha le 20 Août 2014
Hello everybody, thanks a lot for fantatic solutions. While all of your solution seem to work, since i have only one decimal after the number , following works out just fine
x = 1234.5; d = 10*rem(x,1); produces:
d = 5
thanks a bunch again
  1 commentaire
Star Strider
Star Strider le 20 Août 2014
My pleasure!

Connectez-vous pour commenter.

Catégories

En savoir plus sur Logical dans Help Center et File Exchange

Tags

Aucun tag saisi pour le moment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by