Asked by Raúl
on 21 Mar 2013

Hi all,

I'm trying to round an array of double values to 2 decimals.

This is my code:

for k=1:n, y(k)=k*st; y(k)= sprintf('%0.2f', y(k)); x(k) = sqrt(d^2+(2*y(k))^2)-d; x(k)= sprintf('%0.2f', x(k)); end

I got the following error message:

In an assignment A(I) = B, the number of elements in B and I must be the same.

BTW! the value n is 10.

I want the arrays y and x with 2 decimal values. Ex: 1.23

Thanks a lot.

Raúl. In an assignment A(I) = B, the number of elements in B and I must be the same.

*No products are associated with this question.*

Answer by Matt Tearle
on 21 Mar 2013

Accepted answer

The reason you're getting the error is that `sprintf` creates a `char` array -- in this case, a 1-by-4 `char` array made up of the 4 characters '1', '.', '2', and '3'. But your assignment is to a single element `y(k)`.

Possible solutions are to index into the kth row of a `char` array, which you should keep separate from your `double` array `y` (otherwise you'll get another error), or to use cell arrays as Wouter suggests, or to just round everything as doubles and avoid strings altogether (as Wouter also suggests).

I'd recommend the last approach. You can always **display** things with `sprintf` or `fprintf` at the end, and this can be done without a `for`-loop: `fprintf(1,'%0.2f\n',x)`

Matt Tearle
on 21 Mar 2013

I don't understand what the problem is. MATLAB, like any numerical language stores all floating-point numbers to a certain precision (in MATLAB, the default is double, which is about 16 decimal places), so rounding 1.234567... to 2 dp means -- by definition -- changing the stored value to 1.230000...

How the number is **stored** is different to how it's **displayed**. MATLAB's default display is 4 dp. If you want the number displayed in a certain format, use something like `fprintf`. In the special case of 2 dp, you could also use the MATLAB command `format bank`, which will set the Command Window display style to 2 dp instead of 4. This is a universal change until you use `format` to change back to a different style.

Answer by Wouter
on 21 Mar 2013

Edited by Wouter
on 21 Mar 2013

How about this:

a = rand(1,10); y ={}; n=length(a);

for k = 1:n y{k} = sprintf('%0.2f',a(k)); end

Because sprintf returns a string, you need to put it in a cell: {}.

You could also round a like this (if you do not want strings):

a = rand(1,10); y = round(a * 100)/100; % two decimals remain; more decimals are set to 0.

Raúl
on 21 Mar 2013

Hi Wouter,

I've modified in this way, but still getting error message.

w ={}; z ={}; for k=1:n, y(k)=k*st; w{k}= sprintf('%0.2f', y(k)); x(k) = sqrt(d^2+(2*w{k})^2)-d; z{k}= sprintf('%0.2f', x(k)); end

The error is the same

Then, i tried with:

for k=1:n, y{k}=k*st; w{k}= sprintf('%0.2f', y{k}); x{k} = sqrt(d^2+(2*w{k}).^2)-d; z{k}= sprintf('%0.2f', x{k}); end

It works, but the cell z is composed by 10 cell of 1x21char... instead of doubles in the way X.XX.

Thanks.

Opportunities for recent engineering grads.

## 4 Comments

## the cyclist (view profile)

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/68086#comment_137954

What is the size of your variable

d? If it is a matrix, then it looks like the lineis trying to assign a matrix into a single element, and that will give the error you see.

## Raúl (view profile)

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/68086#comment_137973

The size of d is 1, it is a double value.

## Walter Roberson (view profile)

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/68086#comment_138092

Are you trying to change how the number is displayed, or to assign a new value that is the old one rounded to 2 decimal digits?

## Raúl (view profile)

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/68086#comment_138693

Hi Walter, the second approach.

Thanks.