【问题标题】:ROUND function in mySql giving strange result after using TRUNCATE使用 TRUNCATE 后 mySql 中的 ROUND 函数给出奇怪的结果
【发布时间】:2018-06-22 13:39:36
【问题描述】:

我正在使用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。(这也是正确的,因为 ROUND(0.5075) 为 1)。

谁能解释一下这里发生的奇怪行为。

我对 vVar 的数据类型有疑问,所以我尝试将其从 DOUBLE(16,2) 更改为 DECIMAL(16,2)。但这并没有什么不同。

有没有办法从第一个表达式中得到 1 ?

 SET vVar = ROUND(TRUNCATE((29.00 * 1.75/100),2));

任何帮助将不胜感激。

【问题讨论】:

  • However, the value that gets stored in vVar is 0 ...您如何确定存储在vVar中的值?
  • @Tim Biegeleisen:我正在使用这个值来更新表中的列
  • 我建议您提供一个可重现的问题演示。

标签: mysql stored-procedures rounding truncate sqldatatypes


【解决方案1】:

糟糕!

请记住,FLOATDOUBLE 数字存储在 二进制 中,而不是 十进制。这意味着您在该表达式中执行的其他所有操作都需要在二进制和十进制之间转换一次或多次。

0.5075 不能DOUBLE 中精确表示——有或没有 (16,2)

DOUBLE(16,2) 添加一个额外的 舍入,即在存储到二进制 DOUBLE 之前到2 个小数 位。

我头晕目眩。

我希望你的也一样。

对于可能的漫无边际来说已经足够了...当我尝试对您的 SET 进行变体时,我得到了 1。我没有构建存储过程;我怀疑SP中还有其他问题。也许您可以构建一个完整的测试用例供我们使用?另外,您使用的是什么版本的 MySQL——万一该版本出现问题。

【讨论】:

  • 这如何回答这个问题?
  • @ScottHunter - 可能不会。但是,一旦 OP 摆脱了舍入问题,问题可能就会消失。
猜你喜欢
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多