如何使用 sprintf 控制 Perl 中的浮点格式?
我通常使用%g
,但似乎指数位数是系统-dependent,并且我无法像 %.4g
或 %.2g
这样的变体工作(它们只是产生相同的结果,不是吗? )。
我实际上想做的是,如果数字(绝对值)在某个范围内(例如 10^5 > |x| > 10^-5),“在可能的情况下”使用简单的浮点表示,否则使用科学计数法。我还想将显示的位数限制为 5 位(这样我就不会得到像 0.12345678901234567890 这样的超大浮点数...)。
一些示例:
0.123456890
-> 0.12346
0.000000000123456
-> 1.23456e-10
我可以直接在 sprintf
中执行此操作还是必须编写一个特殊的包装器?
I usually use %g
, but it seems the number of exponent digits is system-dependent, and I can't variants like %.4g
or %.2g
to work (they simply produce the same results, don't they?).
What I actually would like to do is to use simple floating point representation "when possible" if the number (in absolute value) is in some range (e.g. 10^5 > |x| > 10^-5), otherwise use scientific notation. I also want to limit the number of digits displayed to, say, 5 (so I won't get super huge floating point numbers like 0.12345678901234567890...).
Some examples:
0.123456890
-> 0.12346
0.000000000123456
-> 1.23456e-10
Can I do that directly in sprintf
or do I have to write a special wrapper?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
不,您必须编写一个自定义包装器才能获得您所描述的行为:作为 perlfunc 说:
请注意,简单浮点表示中的前导零不算作“数字”。
CPAN 上有一些模块可以帮助您编写类似 sprintf 的函数。 String::Sprintf 用于向常规
sprintf
格式。 String::Formatter 用于从头开始使用看起来像sprintf
但不继承它的任何格式。No, you'd have to write a custom wrapper to get the behavior you describe: As perlfunc says:
Note that leading zeros in the simple floating point representation are not counted as "digits".
There are some modules on CPAN that'll help you write a sprintf-like function. String::Sprintf is for adding a custom format or two to the regular
sprintf
formats. String::Formatter is for starting from scratch with a function that looks likesprintf
but doesn't inherit any formats from it.