我在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)我做了一些更多的测试,但是从结果中可以很清楚地看到,函数的结果被舍入为整数值,尽管函数被声明为returns decimal。我尝试将decimal类型替换为float,但这一点并没有改变。
那么,为什么会出现这种四舍五入,更重要的是,我应该如何防止它呢?
发布于 2013-11-27 13:20:03
发布于 2013-11-27 13:27:03
没有精确声明的十进制意味着0的精度。
mysql> select CAST(1/50 as Decimal);
+-----------------------+
| CAST(1/50 as Decimal) |
+-----------------------+
| 0 |
+-----------------------+
1 row in set (0.00 sec)
mysql> select CAST(1/50 as Decimal(10,4));
+-----------------------------+
| CAST(1/50 as Decimal(10,4)) |
+-----------------------------+
| 0.0200 |
+-----------------------------+
1 row in set (0.00 sec)如果您将其更改为浮点数或小数点(10,4),它将工作。
mysql> delimiter $$
mysql> create function myd6(var float) returns float language sql deterministic begin declare res float; set res = var / 50; return res; end$$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> select myd6(1);
+----------------------+
| myd6(1) |
+----------------------+
| 0.019999999552965164 |
+----------------------+
1 row in set (0.00 sec)发布于 2013-11-27 13:21:51
需要指定分数:
mysql> SELECT 1/2 ;
+--------+
| 1/2 |
+--------+
| 0.5000 |
+--------+
mysql> SELECT CAST(1 / 50 AS DECIMAL);
+-------------------------+
| CAST(1 / 50 AS DECIMAL) |
+-------------------------+
| 0 |
+-------------------------+
1 row in set (0.00 sec)
mysql> SELECT CAST(1 / 50 AS DECIMAL(10,2));
+-------------------------------+
| CAST(1 / 50 AS DECIMAL(10,2)) |
+-------------------------------+
| 0.02 |
+-------------------------------+https://stackoverflow.com/questions/20243479
复制相似问题