【问题标题】:PHP math with long decimals带长小数的 PHP 数学
【发布时间】:2014-06-27 13:47:41
【问题描述】:

我目前正在尝试使用大小数进行数学运算。这工作正常:

<?php
$math = 99 + 0.0001;
echo $math;
?>

Output: 99.0001

但是,当我尝试添加超过 12 位小数的小数时,我没有收到预期的输出:

<?php
$math = 99 + 0.0000000000001;
echo $math;
?>

Output: 99

我怎样才能做到这一点,如果我加上一个小数点超过 12 位的小数,结果仍然会有准确的答案而不需要四舍五入?例如:

<?php
$math = 99 + 0.0000000000001;
echo $math;
?>

Output: 99.0000000000001

【问题讨论】:

  • 使用BC Math
  • 通过使用 sprint() 或调整 php.ini 中的精度设置来防止 PHP 在显示时舍入
  • @BiVOC - 不太确定这个问题与整数的最大大小有关,发帖人询问浮点值
  • 你的申请是什么?如果你在做科学计算或类似 3D 几何的东西,那可能没关系 - 12 位有效数字绰绰有余,只需使用 printf 格式化。如果您准备牺牲速度换取精度,请使用 BC Math。

标签: php math decimal addition


【解决方案1】:

快速谷歌搜索产生this

浮点数的精度有限。虽然这取决于 系统,PHP 通常使用 IEEE 754 双精度格式, 由于顺序四舍五入,这将给出最大的相对误差 1.11e-16。

我链接的页面有很多关于 PHP 中浮点数的有用信息,以及指向可以处理任意精度浮点数的库的链接。根据您的需要可能会有用。

编辑:另外,正如 Mark Ba​​ker 在评论中所说,您可能还需要在 printf() 格式字符串中指定要打印的数字的精度。检查this page 并查看数字 5。

【讨论】:

  • 请注意,内部数字精度(64 位双精度与 32 位单精度与 128 位长双精度)与打印格式的位数或精度不同。显然,您无法格式化原始原始数字中不存在的内容,并且您可以拥有大量的内部精度,但如果您没有格式化到足够的小数位......欢迎来到数值分析 101 的精彩世界!
  • @PhilPerry:PHP 的zval 使用double 来存储小数,根据定义,它是C 中的双精度浮点数。由于PHP 是用C 编写的,因此假设是公平的浮点数是 64 位双精度。 C 标准没有指定long double。它可以与double 相同,可以是 80 位精度数据类型,也可以是 IEEE 四倍 128 位格式。你只是不能确定
  • 重点仍然是,您必须了解数字的内部表示能够存储什么,以及如何格式化数字以进行表示。您还需要注意数学运算对范围相距甚远,甚至值非常接近的数字的影响。这都是基本的 NA。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多