I have a function that uses fix and rem functions but if the entered number is big it does not give the right number.

2 次查看(过去 30 天)
double d;
function denominationsCounter(d)
double d50;
double d20;
double d10;
double d5;
double d2;
double d1;
double d50p;
double d20p;
double d10;
double d5p;
double d2p;
double d1p;
d50 = fix(d/50);
d = rem(d,50);
d20 = fix(d/20);
d = rem(d,20);
d10 = fix(d/10);
d = rem(d,10);
d5 = fix(d/5);
d = rem(d,5);
d2 = fix(d/2);
d = rem(d,2);
d1 = fix(d/1);
d = rem(d,1);
d50p = fix(d/0.5);
d = rem(d,0.5);
d20p = fix(d/0.2);
d = rem(d,0.2);
d10p = fix(d/0.1);
d = rem(d,0.1);
d5p = fix(d/0.05);
d = rem(d,0.05);
d2p = fix(d/0.02);
d = rem(d,0.02);
d1p = fix(d/0.01);
d = rem(d,0.01);
disp("Number of Notes: 50:"+d50 +",20:"+ d20 +",10:"+d10+",5:"+d5)
disp("Number of Coins: 2:" +d2 + ",1:"+ d1 + ",50p:" +d50p + ",20p:" +d20p + ",10p:" +d10p + ",5p:" + d5p + ",2p:" +d2p+ ",1p:"+d1p)
disp(d)
This function will calculate the least number of denominations required for an entered amount
for example if I entered 9.33, it show this 10p:0,5p:0,2p:1,1p:1 which means that it will take 1 of 2p coins and 1 of 1p coins for the required amount. while if I entered 15.33 or 20.33 it will show 2p:1,1p:0. It will not add the 1p coin. If the reminder is 1 it is not showing 1p:1 it is showing as zero. Any ideas please to make it suitable for all numbers?
  1 个评论
Walter Roberson
Walter Roberson 2021-12-12
Note: MATLAB does not use declarations of variables like that.
double d50;
would be interpreted as
double('d50');
which would look up the codes used to encode 'd' '5' '0' and convert those uint16 to double precision, and then throw away the result because of the semi-colon.

请先登录,再进行评论。

采纳的回答

Walter Roberson
Walter Roberson 2021-12-12
function denominationsCounter(D)
F = 100;
d = round(D * F);
f = round(50*F);
d50 = fix(d/f);
d = rem(d,f);
f = round(20*F);
d20 = fix(d/f);
d = rem(d,f);
f = round(10*F);
d10 = fix(d/f);
d = rem(d,f);
f = round(5*F);
d5 = fix(d/f);
d = rem(d,f);
f = round(2*F);
d2 = fix(d/f);
d = rem(d,f);
f = round(1*F);
d1 = fix(d/f);
d = rem(d,f);
f = round(0.5*F);
d50p = fix(d/f);
d = rem(d,f);
f = round(0.2*F);
d20p = fix(d/f);
d = rem(d,f);
f = round(0.1*F);
d10p = fix(d/f);
d = rem(d,f);
f = round(0.05*F);
d5p = fix(d/f);
d = rem(d,f);
f = round(0.02*F);
d2p = fix(d/f);
d = rem(d,f);
f = round(0.01*F);
d1p = fix(d/f);
d = rem(d,f);
disp("Number of Notes: 50:"+d50 +",20:"+ d20 +",10:"+d10+",5:"+d5)
disp("Number of Coins: 2:" +d2 + ",1:"+ d1 + ",50p:" +d50p + ",20p:" +d20p + ",10p:" +d10p + ",5p:" + d5p + ",2p:" +d2p+ ",1p:"+d1p)
disp(d/F)

更多回答(1 个)

Voss
Voss 2021-12-12
This problem is due to the nature of finite-precision floating-point numbers.
In this case, since you know (presumably) that any number input into the program will be a multiple of 0.01 (i.e., no fractional cents/pence allowed), a solution is to round d to 2 decimal places each time it's calculated, e.g.:
d = round(rem(d,50),2); % and so on every time d is updated
Aternatively, you can redefine d to be in units of cents/pence rather than dollars/pounds/euros/whatever and then just round to the nearest integer.
  3 个评论

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Get Started with MuPAD 的更多信息

标签

产品


版本

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by