我不明白使用sprintf命令发生的下一件事。
>> vpa(exp(1),53)
ans =
2.7182818284590455348848081484902650117874145507812500
>> e = 2.7182818284590455348848081484902650117874145507812500
e =
2.7183
>> sprintf('%0.53f', e)
ans =
2.71828182845904550000000000000000000000000000000000000
为什么sprintf
向我显示数字e
四舍五入而不是数字,我保留在第一位?
答案 0 :(得分:5)
MATLAB中的变量默认为double precision ,因此您创建的变量e
限制为double的精度,大约为16位。即使你输入了更多的数字,双精度也没有准确表示所有这些额外数字的精度,并且四舍五入到它可以代表的最接近的数字。
编辑:正如Andrew Janke在我发布的this follow-up question回复中更详细解释的那样,您为e
选择的数字恰好是二进制值的精确十进制扩展。换句话说,它是附近浮点数可以舍入到的精确可表示的值。但是,在这种情况下,超过小数点后大于16位的任何内容都不会被认为是重要的,因为它无法通过双精度类型精确表示。因此,像SPRINTF这样的函数会自动忽略这些小值,而不是打印零。