MySQL函数 - 奇怪的除法结果?

Ale*_*s G 5 mysql function rounding division

我在MySQL中看到一些与用户创建的函数相关的奇怪行为.我会尽可能简化这一点.

mysql> SELECT 1 / 50

+--------+
| 1/50   |
+--------+
| 0.0200 |
+--------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.现在我创建一个函数来进行这个除法并调用函数:

mysql> delimiter $$
mysql> create function myd(var decimal) returns decimal language sql deterministic
    -> begin
    ->     declare res decimal;
    ->     set res = var / 50;
    ->     
    ->     return res;
    -> end
    -> $$
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> select myd(1);
+--------+
| myd(1) |
+--------+
|      0 |
+--------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

很奇怪.好吧,让我们尝试一些其他值:

mysql> select myd(10), myd(20), myd(50), myd(70), myd(100);
+---------+---------+---------+---------+----------+
| myd(10) | myd(20) | myd(50) | myd(70) | myd(100) |
+---------+---------+---------+---------+----------+
|       0 |       0 |       1 |       1 |        2 |
+---------+---------+---------+---------+----------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

我做了一些测试 - 但是从结果中可以清楚地看到函数的结果被舍入为整数值,尽管函数被声明为returns decimal.我尝试用替换类型decimal,float但没有改变一点.

那么为什么要进行这种四舍五入,更重要的是,我该如何预防呢?

jue*_*n d 5

如果没有为小数指定精度,则DECIMAL(M,0)默认情况下为逗号后的位数.

示例:将其定义为

decimal(10,3) 
Run Code Online (Sandbox Code Playgroud)

逗号后有3位数字.

资源