首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL函数-奇怪的除法结果?

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

Stack Overflow用户
提问于 2013-11-27 13:12:32
回答 3查看 1.3K关注 0票数 5

我在MySQL中看到了一些与用户创建的函数相关的奇怪行为。我会尽量简化这件事。

代码语言:javascript
复制
mysql> SELECT 1 / 50

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

到目前一切尚好。现在,我创建了一个函数来执行这个除法,并调用该函数:

代码语言:javascript
复制
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)

很奇怪。好的,让我们试试其他一些值:

代码语言:javascript
复制
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,但这一点并没有改变。

那么,为什么会出现这种四舍五入,更重要的是,我应该如何防止它呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-27 13:20:03

如果没有为小数点指定精度,默认情况下它将是DECIMAL(M,0),即逗号后面的数字。

示例:将其定义为

代码语言:javascript
复制
decimal(10,3) 

在逗号后面有三个数字。

来源

票数 5
EN

Stack Overflow用户

发布于 2013-11-27 13:27:03

没有精确声明的十进制意味着0的精度。

代码语言:javascript
复制
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),它将工作。

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2013-11-27 13:21:51

需要指定分数:

代码语言:javascript
复制
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 |
+-------------------------------+
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20243479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档