【问题标题】:Laravel (or PHP/MySQL?) cuts float numbers after decimal pointLaravel(或 PHP/MySQL?)在小数点后减少浮点数
【发布时间】:2018-07-09 01:03:21
【问题描述】:

也许这是一个更一般的 MySQL 或 PHP 问题,因为我缺乏这些领域的知识,但是...

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

我在 talbe 中有一个专栏,通过迁移创建:

$table->float('operator_price', 9, 2)->nullable()->change();

(根据Laravel docs,这应该意味着该列的类型为“FLOAT”,总位数为 9,小数点后为 2)

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

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

如果数字超过 9999,它会删除最后一位。

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

谢谢。


更新:我已经完成了 SHOW COLUMNS FROM tours;

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

【问题讨论】:

  • 存储前的验证怎么样? ['amount' => 'max:9999']
  • 您是否确定您的迁移成功并且该字段实际上是float(8,2) 类型?
  • 请检查您的 phpmyadmin operator_price 列类型
  • @Sohel0415 - 是的,它的类型为“float”
  • @LeventeOtta,存储前没有这样的验证。

标签: php mysql laravel floating-point


【解决方案1】:

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

$table->decimal('operator_price', 10, 2); // instead of float

阅读this了解详细信息和float manual from MySql

【讨论】:

  • 精度不是问题,说 double 不如 decimal(10, 2) 精确是不正确的。 Double 的精度为 4503599627370496 或更高的一部分,但 decimal(10, 2) 至多是 10000000000 的一部分。问题是小数与用于存储和表示货币的值相称。但应该记住,在进行除加法、减法或乘以整数之外的任何计算时,decimal 的失败方式与 double 相同。 例如,不能用十进制计算卖三件东西的单价。
  • 你忘了说列名应该是$table->decimal('operator_price', 10, 2)
  • 谢谢@GaneshGhalame,我已经修好了。
【解决方案2】:

根据 Laravel 迁移documentation

$table->float('amount', 8, 2);  

具有精度(总位数)和小数位数(小数位数)的 FLOAT 等效列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 2021-11-30
    • 2021-11-06
    • 2019-02-01
    相关资源
    最近更新 更多