【问题标题】:Laravel issue when printing a double field coming from the database打印来自数据库的双字段时的 Laravel 问题
【发布时间】:2019-10-18 08:32:16
【问题描述】:

我有一个关于 laravel 或 php 的问题(还不知道),问题是下一个:

我的数据库中有一个名为 debe 的字段,其值为 3.97,如下所示。此字段为double(11,2)

当我访问框架上的该字段时,例如使用 dd(),它会正确返回值,如下所示。

主要问题发生在我尝试打印到视图时,我收到下一个:

我不知道为什么会这样,但现在我发现的唯一解决方案是使用 PHP round() 函数对值进行舍入。

问候

【问题讨论】:

  • 你能发布你的代码吗?你的问题是为什么dd 输出是集合?
  • number_format怎么样?
  • @lighter 我的问题是为什么 php 或 laravel 正在格式化字段,数据库中的字段是 3.97,问题是为什么我得到 3.96999999998 而没有 3.97
  • 问题只是号码的Precision

标签: php laravel eloquent


【解决方案1】:

查看官方文档中this的文章:

浮点数的精度有限。虽然这取决于 系统,PHP 通常使用 IEEE 754 双精度格式, 由于顺序四舍五入,这将给出最大的相对误差 1.11e-16。非初等算术运算可能会给出更大的 错误,当然,必须考虑错误传播 几个操作是复合的。

此外,有理数可以精确表示为 以 10 为底的浮点数,如 0.1 或 0.7,没有 精确表示为以 2 为底的浮点数,即 内部使用,无论尾数大小。因此,他们 如果没有 精度损失小。这可能会导致令人困惑的结果:对于 例如, floor((0.1+0.7)*10) 通常会返回 7 而不是 预期为 8,因为内部表示将类似于 7.9999999999999991118....

所以永远不要相信浮点数结果到最后一位,也不要 直接比较浮点数是否相等。如果更高 精度是必要的,任意精度的数学函数和 gmp 功能可用。

您可以使用roundnumber_format 函数来获得所需的小数

【讨论】:

  • 感谢您的回答,我阅读了文档并同意,但还有一个问题......它是随机发生的吗?因为例如 3.98 打印得很好......
猜你喜欢
  • 2021-02-08
  • 2019-11-29
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多