在 MATLAB 中指定打印值的最大宽度

Specify maximum width of printed value in MATLAB

sprintf 和 fprintf 的字段宽度参数(例如,"sprintf('%nf',1234)" 中的 "n")指定字段的 最小值 宽度。这意味着较短的数字将被填充,但较长的数字将被允许超出指定的字段宽度,如果这是保持指定精度所必需的。我正在寻找一种方法来指定 最大 字段宽度,以便宽度取代精度。

例如,我希望 1234.56、1234.56789 和 1.2345 的宽度为 8 个字符(包括小数点),因此分别打印为 1234.560、1234.567 和 1.234500。

这是一个类似的问题,但没有特定于 MATLAB 的解决方案 Specifying maximum printf field width for numbers (truncating if necessary)?

我觉得以前肯定有人遇到过这个问题,但我找不到任何相关的东西。如果存在类似问题,请提供 link。谢谢

您可以使用 floor(log10()) 来确定您有多少个非浮动数字:

X    = [1234.56, 1234.56789, 1.2345]
n    = 8 % number of total digits.
% We create an array of string containing the format: 
%[ '%.4f\n'
%  '%.4f\n'
%  '%.7f\n' ]
form = strcat('%.',num2str(n-1-floor(real(log10(X))).'),'f\n')
% We concatenate this array into one single string and we print the result:
fprintf(reshape(form.',1,[]),X) 

或者您可以使用 for 循环(使用相同的逻辑):

for x = X
    form = strcat('%.',num2str(7-floor(real(log10(x)))),'f\n');
    fprintf(form,x)
end

我们得到:

1234.5600
1234.5679
1.2345000

编辑:

我使用 floor(log10()) 而不是 ceil(log10()),因此如果数字是集合 10^n(1,10,100...)的一部分,代码将不会失败。

现在这段代码可以处理负浮点数,因为我只取 log10 输出的实部。

如果您不介意截断而不是四舍五入隐藏数字,请尝试

S = num2str( X(:), '%-10.9f');  % creates a left-justified character-array
fprintf( '%s\n', string( S(:,1:7) ) )

(需要检查 X 的值是否太大。)