# Better way to combine number with fraction?

3 views (last 30 days)
Haisam Khaled on 1 Feb 2024
Commented: Haisam Khaled on 3 Feb 2024
I have this struct output (from ROS2 message):
MessageType: 'builtin_interfaces/Time'
sec: 1706819594
nanosec: 685974901
I want to combine sec and nanosec in one value like this:
1706819594.685974901
I used the following line of code (and it worked):
Is there a better way ?

Stephen23 on 1 Feb 2024
Edited: Stephen23 on 1 Feb 2024
Note that you will need to use SPRINTF (or COMPOSE etc) to get the right output when NANOSEC has fewer than the full nine digits:
s = 1706819594;
ns = 685974901;
sprintf("%d.%09d",s,ns)
ans = "1706819594.685974901"
ns = 123;
sprintf("%d.%09d",s,ns)
ans = "1706819594.000000123"
Whereas your format string will given an incorrect output:
s + sprintf(".%d",ns)
ans = "1706819594.123"
If the input number has more than nine digits then the output will be wrong anyway.
Stephen23 on 3 Feb 2024
If the two values are numeric and you want a single numeric output then skip the intermediate text:
format long G
s = 1706819594;
ns = 685974901;
out = s + ns/1e9
out =
1706819594.68597
As mentioned elsewhere in this thread, converting to numeric will irretrievably lose information.
Haisam Khaled on 3 Feb 2024
Yes yes I understood this part, thank you. I was just explaining why I need these time stamps in a certain format (fast).

Jon on 1 Feb 2024
If you want to use it as a numerical value I would do this
Jon on 1 Feb 2024
Edited: Jon on 1 Feb 2024
Good catch, I hadn't thought about the finite precision limitation, using doubles to represent large values (1e9) to nano second precision.
Haisam Khaled on 2 Feb 2024
Thank you so much, this is actually incredibly creative. I will use this method since the numbers are already "double".

### Categories

Find more on Publishers and Subscribers in Help Center and File Exchange

R2023b

### Community Treasure Hunt

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

Start Hunting!