【问题标题】:Why in PHP printf() "g" type-specifier gives wrong value? [duplicate]为什么在 PHP printf() "g" 类型说明符中给出错误的值? [复制]
【发布时间】:2017-11-17 20:21:52
【问题描述】:

根据documentation, "g - %e 和 %f 中较短的"

我已经执行了这个语句:

printf("e:%1\$.3e\nf:%1\$.3f\ng:%1\$.3g", .123e2);

这是输出:

e:1.230e+1 // long value
f:12.300 // shorter value
g:12.3 // here g gives something else

为什么"g" 提供了其他内容,我是不是把文档弄错了?

$ php -v
PHP 7.1.10 (cli) (built: Oct 19 2017 15:16:13) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
    with Xdebug v2.5.1, Copyright (c) 2002-2017, by Derick Rethans

【问题讨论】:

  • 这个问题不是 PHP 独有的,尽管 PHP 是我知道的唯一一种语言,官方文档 会在哪里出现这个错误。 g 说明符的相同错误文档可以在包括 C 在内的许多语言中找到 - 并且所有语言的实际行为都是相同的。请参阅我在 What precisely does the %g printf specifier mean? 的文章,其中引用了您在此处引用的相同 PHP 文档,并在其中解释了实际行为与仅选择较短的 %f 和 %e 有何不同。

标签: php printf


【解决方案1】:

sprintf() 最终委托给sprintf(3) C 函数。来自printf(3) 手册页:

Precision

   [...] This gives ... the maximum number of significant digits for g and G 
   conversions...

因此,PHP 文档充其量是不准确的。

【讨论】:

  • 是的,这是有道理的。所以它在内部切断了无关紧要的零。
  • 不完全。 $ printf '%.5g\n' 123.001123$ printf '%.5g\n' 123.1234123.12
猜你喜欢
  • 1970-01-01
  • 2019-06-07
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
相关资源
最近更新 更多