在MATLAB中使用sprintf显示变量的小数

Pet*_*one 6 variables matlab printf decimal

我不明白使用sprintf命令发生的下一件事.

>> vpa(exp(1),53)

ans =

2.7182818284590455348848081484902650117874145507812500


>> e = 2.7182818284590455348848081484902650117874145507812500

e =

2.7183

>> sprintf('%0.53f', e)

ans =

2.71828182845904550000000000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

为什么sprintf要向我显示数字e而不是数字,我保留在第一位?

gno*_*ice 5

默认情况下,变量在MATLAB中是双精度 ,因此e您创建的变量仅限于double的精度,大约为16位.即使你输入了更多的数字,双精度也没有准确表示所有这些额外数字的精度,并且四舍五入到它可以表示的最接近的数字.

编辑:正如Andrew Janke在回答我发布的后续问题时所做的更详细的解释,您选择的数字e恰好是二进制值的精确十进制扩展.换句话说,它是附近的浮点数将四舍五入的精确可表示的值.但是,在这种情况下,超过小数点后大于16位的任何内容都不会被认为是重要的,因为它无法通过双精度类型精确表示.因此,像SPRINTF这样的函数会自动忽略这些小值,而不是打印零.