一个奇怪的现象:求“斜边”的函数,一个返回float,一个返回double,返回float的结果看不懂,求指导

MySql 码拜 4年前 (2016-02-21) 173次浏览
delimiter //
create function xie1(n1 int,n2 int)
returns float
begin
set @result = pow(n1*n1+n2*n2, 0.5);
return @result;
end//
create function xie2(n1 int,n2 int)
returns double
begin
set @result = pow(n1*n1+n2*n2, 0.5);
return @result;
end//
select xie1(5,6)
union
select xie2(5,6)
//
得到结果为:
+–+
| xie1(5,6)          |
+–+
| 7.8102498054504395 |
|  7.810249675906654 |
+–+
2 rows in set (0.00 sec)
问题就是:float只是只有6-7位精度么,怎么返回那么多?另外,在返回的数据中,小数点后第7位的“8”,也是怪怪的,跟返回double类的函数的结果中的”7.81024967…..”也似乎没什么关系。本人的意思是,假如返回float的结果数据中是7.8102496….之类,本人觉得还能理解。
求指导释。
注意:函数内部的计算是一样的,即pow()的计算结果按理是一样的。
解决方案

40

LZ不做UNION返回是什么结果?
另外可以把POWER去掉。直接用值试试。set @result = 7.810249675906654
估计问题总归是在数据类型转换上。

40

问题应该是在  create function xie1(n1 int,n2 int)  returns float 上,MYSQL估计是不管float 还是 double 都会以 double 返回。导致先截取成FLOAT然后再被转换为 double.
估计 要去分析源代码了。

20

建议小数要求精度的时候, 还是定义成 decimal 类型比较好控制

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明一个奇怪的现象:求“斜边”的函数,一个返回float,一个返回double,返回float的结果看不懂,求指导
喜欢 (0)
[1034331897@qq.com]
分享 (0)