我有一个相当不正统的家庭作业,我要编写一个简单的函数,其中double
值四舍五入为整数,仅使用while
循环。
主要目标是写一些类似圆函数的东西。
我做了一些进展,我应该添加或减去一个非常小的double
值,我最终会得到一个将成为整数的数字:
while(~isinteger(inumberup))
inumberup=inumberup+realmin('double');
end
但是,这会导致永无止境的循环。有没有办法完成这项任务?
我不允许对此问题使用round
,ceil
,floor
,for
,rem
或mod
。< / p>
答案 0 :(得分:3)
假设: if
语句和abs
函数是允许的,因为禁止函数列表不包含此内容。
这是一个解决方案。您可以做的是将输入值减去1直到达到小于1的点。此点后产生的数字是数字的小数部分(即,如果我们的数字为3.4,分数成分为0.4)。然后,您将检查我们称之为f
的小数分量是否小于0.5。如果是,则表示您需要向下舍入,因此您将使用f
减去输入数字。如果该数字大于0.5或等于0.5,您将添加输入数字(1 - f)
,以便达到下一个最高数字。但是,这仅处理正值的情况。对于负值,MATLAB中的round
向负无穷大舍入,因此我们应该采用输入数的绝对值并执行此减法以查找小数部分。
一旦我们这样做,然后我们检查分数部分等于什么,然后根据数字的符号,我们相应地加或减。如果小数部分小于0.5并且数字为正数,我们需要减去f
,否则我们需要按f
添加。如果小数部分大于或等于0.5,如果数字为正数,我们需要加(1 - f)
,否则我们减去(1 - f)
因此,假设num
是感兴趣的输入数字,您可以这样做:
function out = round_hack(num)
%// Repeatedly subtract until we get a value that less than 1
%// i.e. the fractional part
%// Also make sure to take the absolute value
f = abs(num);
while f > 1
f = f - 1;
end
%// Case where we need to round down
if f < 0.5
if num > 0
out = num - f;
else
out = num + f;
end
%// Case where we need to round up
else
if num > 0
out = num + (1 - f);
else
out = num - (1 - f);
end
end
请注意,对于较大的num
值,这将会很慢。我还把它包装成一个易于调试的函数。以下是一些示例运行:
>> round_hack(29.1)
ans =
29
>> round_hack(29.6)
ans =
30
>> round_hack(3.4)
ans =
3
>> round_hack(3.5)
ans =
4
>> round_hack(-0.4)
ans =
0
>> round_hack(-0.6)
ans =
-1
>> round_hack(-29.7)
ans =
-30
对于上述测试用例,您可以检查这与MATLAB的round
函数是否一致。
答案 1 :(得分:0)
你可以不用循环来做:你可以使用num2str
将数字转换为字符串,然后在字符串中找到.
的位置,并从字符串开头提取字符串到.
的位置;然后你用str2num
要对其进行舍入,您必须在.
之后检查第一个字符(转换为数字)的值。
r=rand*100
s=num2str(r)
idx=strfind(num2str(r),'.')
v=str2num(s(idx+1))
if(v <= 5)
rounded_val=str2num(s(1:idx-1))
else
rounded_val=str2num(s(1:idx-1))+1
end
希望这有帮助。
Qapla&#39;