Laravel(或PHP / MySQL?)减少小数点后的浮点数

Ser*_*min 5 php mysql floating-point laravel

也许这是由于我对这些领域缺乏知识而引起的一个更普遍的MySQL或PHP问题,但是...

所以我在Laravel 5.4上有一个应用程序,数据库是MySQL 5.7.17

我在talbe中有一列,是通过迁移创建的:

$table->float('operator_price', 9, 2)->nullable()->change();
Run Code Online (Sandbox Code Playgroud)

(根据Laravel docs的说法,这应意味着列的类型为“ FLOAT”,总位数为9,小数点后为2) 在此处输入图片说明

当用户在表单字段中输入1000.25并保存-它保存为“ 1000.25”时,

但是,如果用户输入10000.25-它会另存为“ 10000.2”。

因此,如果数字超过9999,则会截断最后一位数字。

可能是什么原因,我该如何解决?

谢谢。


更新:我已经从巡回演出中显示了栏目;

它显示列“ operator_price”的类型为“ float”:

在此处输入图片说明

The*_*pha 5

实际上,浮点/双精度不如十进制精确。对于货币数据,建议使用十进制类型,因此您应该使用:

$table->decimal(10, 2); // instead of float
Run Code Online (Sandbox Code Playgroud)

阅读本文以获得一些详细信息,并从MySql浮动手册

  • 精度不是问题,不能说双精度不如十进制(10,2)。Double的精度为4503599627370496或更高,但十进制(10,2)最多为10000000000的一分之一。问题是十进制与用于存储和表示货币的值相对应。但是要记住,十进制在进行除加法,减法或乘以整数以外的任何计算时都会以与double相同的方式失败。*例如*,如果要计算以1美元售出3件商品的单价,则不能用十进制表示。 (2认同)