所以我正在将一个旧的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;');
该问题与MYSQL连接有关,具体设置PDO::ATTR_EMULATE_PREPARES
为true。
PDO :: ATTR_EMULATE_PREPARES使您可以在准备好的语句中重用参数,例如,您可以使用:id
代替:id1, :id2, :id3
。true
在PHP> = 7.2上将其设置为时,它将导致所有浮点都强制转换为整数,因此会降低精度。这是由于Laravel不支持此PDO标志。
本质上有两种选择:
将PDO :: ATTR_EMULATE_PREPARES设置为false,然后像那样开始唯一地命名参数:id1, :id2, :id3
。
要么
将您的浮点数设置为字符串,这时它们将保留其小数位,因为Laravel将不再将其视为浮点数并将其转换为整数。
如果您想阅读更多关于GitHub的信息,请参见以下问题:https : //github.com/laravel/framework/issues/23850