【问题标题】:Wy PHP is better than Javascript in Floating point Arithmetic? [duplicate]为什么 PHP 在浮点运算中优于 Javascript? [复制]
【发布时间】:2017-07-13 22:06:17
【问题描述】:

PHP

<?php echo (-9.341+2.111);

结果 -7.23

Javascript

console.log(2.111-9.341)

结果-7.229999999999999

我知道浮动算术,但为什么 vanilla PHP 给出准确的答案而 Javascript(在 Google Chrome 控制台上测试)没有?

【问题讨论】:

  • 你会发现很多地方 PHP 也会给你重复的数字。
  • JavaScriptPHP 都使用 IEEE 754,echo 可能是四舍五入(注意 PHP 浮点数是 32b 还是 64b 取决于平台)
  • -7.23 似乎没有有限的二进制表示。
  • echo (-9.341+2.111 == -7.23 ? "true" : "false"); 结果:假

标签: javascript php precision numeric


【解决方案1】:

四舍五入的是php的echo

var_dump(sprintf('%.20f', -9.341+2.111)); // string(23) "-7.22999999999999864997"

php sources 中,echo 会使用以下转换将浮点数转换为字符串:

str = zend_strpprintf(0, "%.*G", (int) EG(precision), dval);

这基本上意味着科学记数法或%f(参见precision 配置指令,默认为14)。

【讨论】:

  • 所以默认是回显那一轮?但是为什么如果我做 var_dump(sprintf('%f', -9.341+2.111)) 我得到“-7.230000”。什么告诉 PHP 在小数点后四舍五入?
  • “我收到了-7.230000。” --- 你期望得到什么?
  • 好的,所以 sprintf 默认舍入到小数点后 6 位并回显到 15 位有效数字专家,对吗?
  • @FabianoTaioli 查看更新后的答案。
猜你喜欢
  • 2012-08-10
  • 2011-07-17
  • 1970-01-01
  • 2017-06-09
  • 2015-06-06
  • 2016-12-17
  • 1970-01-01
  • 2018-07-01
  • 2021-09-26
相关资源
最近更新 更多