在float类型值上使用GREATEST()会导致不准确的结果
问题描述:
我正在试验mysql,并且使用GRATEST()
函数作了一个查询来比较两个不同的字段。在float类型值上使用GREATEST()会导致不准确的结果
我的查询看起来是这样的:
SELECT
id,
float1,
float2,
GREATEST(
IFNULL(float1, 0),
IFNULL(float2, 0)
) AS gtst
FROM `test`
Float1和2是无符号上浮,用NULL作为默认值。 服务器版本:5.1.73-1-log,客户端:5.0.8-dev,PHP扩展名:mysqli。
运行上面的命令,让我奇怪的值是这样的:
| id | float1 | float2 | gtst |
|-----|--------|--------|------------------|
| 872 | 348.5 | 348.58 | 348.579986572266 |
我知道,MySQL的奇怪处理浮点值,因为它是在this article描述,但如果是未来,这些额外的数字是我不清楚从?
单个比较不应改变提供的值,对吧?这里没有数学公式可能会发生舍入误差,所以可能会出错?
在此先感谢!
答
它好像你已经宣布float1和FLOAT2为float数据类型,这通常需要12个分数点像10.123456789101化妆用的
Round(10.123456789101,2);
显示2倍额外的数字为,10.12
嗯,这是浮动的您。尝试给它一个精确的,更好的主意,不要使用浮点数,你真正想要的是小数点!也就是说,这个结果没有任何不准确的地方! – Strawberry 2015-03-03 08:51:19
看起来像MySQL将'FLOAT'强制转换为'DOUBLE',并且由于这种类型的精度不同,最终会产生一些垃圾。 – PetSerAl 2015-03-07 16:21:48
@PetSerAl Hm,现在有道理。感谢你的回答! – 2015-03-16 15:15:06