【发布时间】:2018-08-17 21:30:20
【问题描述】:
假设我创建了一些数字A,顺序为10^4:
A = 81472.368639;
disp(A)
8.1472e+04
这不是我想要的。我的小数点在哪里?应该还有六位小数。检查变量编辑器向我展示了这一点:
再次,我丢失了小数点。如何保留这些以供进一步计算?
【问题讨论】:
标签: matlab floating-point numbers number-formatting
假设我创建了一些数字A,顺序为10^4:
A = 81472.368639;
disp(A)
8.1472e+04
这不是我想要的。我的小数点在哪里?应该还有六位小数。检查变量编辑器向我展示了这一点:
再次,我丢失了小数点。如何保留这些以供进一步计算?
【问题讨论】:
标签: matlab floating-point numbers number-formatting
您没有丢失任何小数,这只是 MATLAB 显示大数的方式。 MATLAB 使用科学计数法将命令窗口和变量编辑器中的数字显示四舍五入到点前一位数和后四位数。科学计数法是Xe+y 表示法,其中X 是某个数字,y 是一个整数。这意味着X 乘以10 到y 的幂,可以将其可视化为“将点向右移动y 位置”(如果y 为负数,则向左移动)。
现在我们知道 MATLAB 做了什么,我们可以强制它显示我们的号码吗?当然,有多种选择,最简单的方法是设置更长的format。最常用于显示长数字的是format long和format longG,我们使用它们的时候区别就很明显了:
format long
A
A =
8.1472368639e+04
format longG
A
A =
81472.368639
format long 使用科学记数法显示所有小数(总共最多 16 个),format longG 尝试显示没有科学记数法但使用大多数可用小数的数字,再次:尽可能多或最多 16 位数字,两者之前和点之后的总数。
如果您想在点之前、点之后或两者都有精确的小数位数,则使用disp(sprintf()) 或fprintf 是一种更奇特的解决方案:
fprintf('A = %5.3f\n',A) % \n is just to force a line break
A = 81472.369
disp(sprintf('A = %5.2f\n',A))
A = 81472.37
最后,还记得变量编辑器吗?我们如何让它完全显示我们的变量?很简单:点击包含数字的单元格:
所以,简而言之:我们没有丢失任何小数,MATLAB 仍然在内部存储它们,它只是默认显示更少的小数。
format 的其他用途
format 有另一个不错的属性,您可以设置format compact,它消除了 MATLAB 通常在命令窗口中添加的所有额外空行:
format compact
format long
A
A =
8.147236863931789e+04
format longG
A
A =
81472.3686393179
我认为,当您不想让命令窗口变得很大但又不想滚动很多时,这非常方便。
format shortG 和 format longG 在您的数组中包含非常不同的数字时很有用:
b = 10.^(-3:3);
A.*b
ans =
1.0e+07 *
0.0000 0.0001 0.0008 0.0081 0.0815 0.8147 8.1472
format longG
A.*b
ans =
Columns 1 through 3
81.472368639 814.72368639 8147.2368639
Columns 4 through 6
81472.368639 814723.68639 8147236.8639
Column 7
81472368.639
format shortG
A.*b
ans =
81.472 814.72 8147.2 81472 8.1472e+05 8.1472e+06 8.1472e+07
即它们在单个数字上的工作方式类似于 long 和 short,但为每个数字选择最方便的显示格式。
还有一些更奇特的选项,例如 shortE、shortEng、hex 等,但您可以在 The MathWork's own documentation on format 中找到详细记录的选项。
【讨论】: