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

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

mysql> SELECT 1 / 50

+--------+
| 1/50   |
+--------+
| 0.0200 |
+--------+
1 row in set (0.00 sec)

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

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)

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

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)

我做了一些测试 – 但是从结果可以清楚地看出函数的结果被舍入为整数值,尽管函数被声明为返回十进制.我尝试用float替换类型decimal,但是没有改变.

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

解决方法:

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

示例:将其定义为

decimal(10,3) 

逗号后有3位数字.

Source

上一篇:Points Division(线段树+DP)2019牛客暑期多校训练营(第一场)


下一篇:(Alpha)Let's-技术文档(技术规格说明书)