sprintf('%d',x) prints out exponential notation instead of decimal notation
Show older comments
I am using version '8.3.0.532 (R2014a)'. The sprintf command seems to print out exponential notation when decimal notation is requested (second and third example):
sprintf('%d',1.05*100)
sprintf('%d',1.10*100)
sprintf('%.0d',1.10*100)
ans = 105
ans = 1.100000e+02
ans = 1e+02
Is there any reason why the last two calls are not printing '110'?
4 Comments
Andrew Reibold
on 26 Aug 2014
Well for one, they don't equal 115 because those equal 105 and 110, haha.
I know what you mean though
Azzi Abdelmalek
on 26 Aug 2014
Why 115 ?
Jeffrey Wildman
on 26 Aug 2014
Edited: Jeffrey Wildman
on 26 Aug 2014
summyia qamar
on 16 Dec 2016
what if we want to change 10.3?what will be the format?%g is not working.
Accepted Answer
More Answers (2)
Andrew Reibold
on 26 Aug 2014
Edited: Andrew Reibold
on 26 Aug 2014
Use f instead of d for floating point notation will stop the scientific I believe.
sprintf('%f',1.05*100)
sprintf('%f',1.10*100)
sprintf('%.0f',1.10*100)
ans = 105.000000
ans = 110.000000
ans = 110
Notice I can stop the decimals by using .0f like I did in the last example.
For additional reference:

3 Comments
Jeffrey Wildman
on 26 Aug 2014
per isakson
on 26 Aug 2014
"Still kinda curious"   Don't you trust my answer?
James Tursa
on 17 Dec 2016
Edited: James Tursa
on 17 Dec 2016
This is what is happening "under the hood" with the floating point numbers (neither 1.05 nor 1.10 can be represented exactly in IEEE double):
>> num2strexact(1.05)
ans =
1.0500000000000000444089209850062616169452667236328125
>> num2strexact(1.05*100)
ans =
1.05e2
>> num2strexact(1.10)
ans =
1.100000000000000088817841970012523233890533447265625
>> num2strexact(1.10*100)
ans =
1.100000000000000142108547152020037174224853515625e2
You got lucky on the 1.05*100 that it resulted in 105 exactly, but you didn't get lucky in the 1.10*100 case.
Sebastian Mader
on 27 Jul 2018
0 votes
So why did Mathworks introduce %d and %i at all? It would be safer to use %.0f in any case.
2 Comments
They are not the same thing at all! For integer types, %u, %d and %i formats give the full precision, whereas what you propose does not:
>> sprintf('%.0f',intmax('uint64')) % rounded
ans =
18446744073709552000
>> sprintf('%u',intmax('uint64')) % full precision
ans =
18446744073709551615
>> sprintf('%.0f',intmax('int64')) % rounded
ans =
9223372036854775800
>> sprintf('%i',intmax('int64')) % full precision
ans =
9223372036854775807
It is obvious from the number of output digits that the '%f' format performs rounding operations using double class.
Sebastian Mader
on 27 Jul 2018
I see your Point, thanks for being very clary on this, much appreciated. I am far from the Limits, where rounding becomes an issue with '%.0f', so I can savely use this approach.
Nonetheless, I believe that the comments on "Notable Behavior of Conversions with Formatting Operators" should be moved up in the documentation and the special case of using %d with double precison numbers mentioned. It is at least to me not obvious at all, that an implicit type conversion is not performed by fprintf despite my desire to print an integer.
Categories
Find more on Characters and Strings in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!