温馨提示:本文翻译自stackoverflow.com,查看原文请点击:php - Doubles losing their decimal places in unit tests
eloquent laravel php phpunit

php - 双打在单元测试中失去小数位数

发布于 2020-04-07 10:08:50

所以我正在将一个旧的Laravel项目从5.3升级到5.4(计划升级到5.8),但是我的单元测试遇到了一个问题,即双精度数丢失了小数位。

这是一个这样的测试的示例(是的,我的测试与数据库交互):

$this->user->message_score = 3.42;
$this->user->save();
echo $this->user->fresh()->message_score; // 3

该表的迁移:

$table->double('message_score')->nullable();

无论我设置什么数字,小数位都会丢失。它不是向上或向下取整,3.42和3.99变为3。

修补匠没有相同的问题。

我想我缺少一些简单的东西。

任何帮助表示赞赏。

编辑

因此,我进行了一次迁移以更新message_score精度,但遇到了同样的问题。在运行迁移之前,数据库中显示的长度为(8,2),而我进行的迁移将其推升至(10,8)迁移如下:

DB::statement('ALTER TABLE `users` MODIFY `message_score` DOUBLE(10,8) NOT NULL DEFAULT 0.0;');

查看更多

提问者
Alex
被浏览
16
Alex 2020-01-31 19:15

该问题与MYSQL连接有关,具体设置PDO::ATTR_EMULATE_PREPARES为true。

PDO :: ATTR_EMULATE_PREPARES使您可以在准备好的语句中重用参数,例如,您可以使用:id代替:id1, :id2, :id3truePHP> = 7.2上将其设置为时,它将导致所有浮点都强制转换为整数,因此会降低精度。这是由于Laravel不支持此PDO标志。

本质上有两种选择:

PDO :: ATTR_EMULATE_PREPARES设置为false,然后像那样开始唯一地命名参数:id1, :id2, :id3

要么

将您的浮点数设置为字符串,这时它们将保留其小数位,因为Laravel将不再将其视为浮点数并将其转换为整数。

如果您想阅读更多关于GitHub的信息,请参见以下问题:https : //github.com/laravel/framework/issues/23850