我使用mysql中的存储过程将以下值设置为双变量。
DECLARE vVar DOUBLE(16,2) DEFAULT 0;
SET vVar = ROUND(TRUNCATE((29.00 * 1.75/100),2));
在mysql编辑器中触发上述表达式得到1(这是正确的,因为round(0.50)会得到1)。但是,存储在vvar中的值是0。
另一方面,如果我写
SET vVar = ROUND(TRUNCATE((29.00 * 1.75/100),4));
然后存储在vvar中的值变为1(这也是正确的,因为圆(0.5075)是1)。
有人能解释一下这里发生的奇怪行为吗。
我对vvar的数据类型有疑问,所以我尝试将它从double(16,2)改为decimal(16,2)。但这没什么区别。
有没有办法从第一个表达式得到1?
SET vVar = ROUND(TRUNCATE((29.00 * 1.75/100),2));
任何帮助都将不胜感激。
1条答案
按热度按时间pkwftd7m1#
讨厌!
请记住
FLOAT
以及DOUBLE
数字是二进制的,而不是十进制的。这意味着您在该表达式中执行的所有其他操作都需要在二进制和十进制之间转换一次或多次。0.5075不能精确表示为
DOUBLE
--带或不带(16,2)DOUBLE(16,2)
在存储到二进制文件之前,添加一个额外的舍入,即小数点后2位DOUBLE
.我头晕。
我希望你的也是。
够梅闲逛了。。。当我试着改变你的
SET
,我明白了1
. 我没有建立一个存储过程;我怀疑sp中存在其他问题。也许您可以构建一个完整的测试用例供我们使用??另外,您使用的是哪一版本的mysql——在这种情况下,该版本中的某些内容可能会被破坏。