为什么sprintf('%i',x)显示科学记数法?

时间:2015-11-06 22:30:25

标签: string matlab printf

在Matlab R2015b中试试这个:

>> sprintf('%i\n',uint64(2)^62)
ans =
4611686018427387904 %// correct

>> sprintf('%i\n',uint64(2)^63)
ans =
9.223372e+18 %// why scientific notation?

在R2010b中情况更糟:低至uint64(2)^31的数字已经导致此行为:

>> sprintf('%i\n',uint64(2)^31)
ans =
2.147484e+009

为什么sprintf'%i''%d'格式说明符使用科学记数法?这可以避免吗?

使用num2str代替sprintf对我来说不是解决方案。即使它确实避免了科学记数法,

>> num2str(uint64(2)^63)
ans =
9223372036854775808 %// correct

我需要使用sprintf,因为num2str不支持“前导空格”格式说明符:

>> sprintf('% 25i\n',uint64(2)^62, uint64(2)^50)
ans =
      4611686018427387904
         1125899906842624 %// correct: leading spaces to give 25 characters for each number

>> num2str([uint64(2)^62;uint64(2)^50], '% 25i\n')
ans =
4611686018427387904
   1125899906842624 %// incorrect: no leading spaces

>> num2str(uint64(2)^50, '% 25i\n')
ans =
1125899906842624 %// incorrect: no leading spaces

1 个答案:

答案 0 :(得分:2)

this question,似乎是MATLAB,出于某种原因(可能是因为它期望来自%i的有符号整数,但是你给它一个无符号的整数),对待那么大 - 数字(2 ^ 63)为float,并将其转换为科学记数法,这也是为什么如果你写sprintf('%.18i\n',bitshift(uint64(2),62))最终会失去精确度:

9.223372036854775800e+18 vs. 9223372036854775808

使用%u而不是%i似乎会产生正确的结果:

sprintf('%u\n',bitshift(uint64(2),62))

ans =

9223372036854775808

(在这个特定场景中使用bitshift更有意义)