在MATLAB中是否有一种快速简便的方法可以截断十进制数,例如超过4位?
Converter<A, B> extends Function<A, B>
没有帮助,它仍在四舍五入。我必须在for循环中使用它,所以最快的方式是值得赞赏的。
感谢您的投入。
答案 0 :(得分:9)
这是截断小数点后d
个数字的一种方法。
val = 1.234567;
d = 4;
val_trunc = fix(val*10^d)/10^d
结果
val_trunc =
1.2345
如果您知道val
是肯定的,那么floor()
将取代fix()
。
答案 1 :(得分:8)
又一个选择:
x = -3.141592653;
x_trun = x - rem(x,0.0001)
x_trun =
-3.1415
感谢gnovice的更新。
一般来说,对于n
小数位:
x_trun = x - rem(x,10^-n)
答案 2 :(得分:5)
如果你想要保留最后一个小数后从小数中减去5
,则截断就像舍入一样。
因此,要将x
截断为n
小数,请使用
round(x - sign(x)*.5/10^n, n)
(感谢@gnovice注意sign(x)
需要处理负数。)
例如,
format long
x = 3.141592653589793;
for n = 2:5
result = round(x - sign(x)*.5/10^n, n);
disp(result)
end
给出
3.140000000000000
3.141000000000000
3.141500000000000
3.141590000000000
答案 3 :(得分:4)
当你要求使用最快的方法时,我已经对这里目前回答的前3种截断方法进行了快速基准测试。请参阅下面的代码。我使用x
函数将timeit
向量的大小增加为四舍五入。
function benchie()
% Set up iteration variables
K = 17; n = 4; T = zeros(K,3);
for k = 1:K
x = rand(2^k,1);
% Define the three truncation functions
LuisRound = @() round(x - 0.5/10^n, n);
JodagFix = @() fix(x*10^n)/10^n;
InfoRem = @() x - rem(x,10^-n);
% Time each function
T(k,1) = timeit(LuisRound);
T(k,2) = timeit(JodagFix);
T(k,3) = timeit(InfoRem);
end
% Plot results
figure
plot(2.^(1:K), T); legend('LuisRound', 'JodagFix', 'InfoRem');
grid on; xlabel('number of elements in x'); ylabel('time taken');
end
结果图可以在这里看到:
根据此测试, jodag 建议的fix
方法明显更快,因此您应该使用类似这样的内容来自定义截断函数{ {1}}小数位:
n
测试:
function y = trunc(x, n)
%% Truncate matrix/scalar x to n decimal places
if nargin < 2; n = 0; end; % default to standard fix behaviour if no n given
y = fix(x*10^n)/10^n; % return value truncated to n decimal places
end
答案 4 :(得分:0)
使用我的round2函数:
function result = round2(x,accuracy)
if nargin<2, accuracy=1; end %default accuracy 1 same as 'round'
if accuracy<=0, accuracy=1e-6; end
result=round(x/accuracy)*accuracy;
end
常用:round2(3.14159,0.01)
但您也可以使用它来舍入到其他所有多重符号,例如:round2(number,2)
将舍入到偶数,或round2(number,10)
等。