使用TRUNCATE

时间:2018-01-13 05:57:16

标签: mysql stored-procedures rounding truncate sqldatatypes

我在mysql中使用存储过程将以下值设置为double变量。

 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));

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:-1)

呸!

请注意, var canvas = document.getElementById("myCanvas"); var context = canvas.getContext("2d"); //circles var center_y = 150;//Y var center_x = 150; var lineWidth = 10; context.lineWidth=lineWidth; context.beginPath(); context.arc(center_x,center_y ,50,0,2*Math.PI); context.strokeStyle = "#FF00FF"; context.stroke(); context.beginPath(); context.arc(center_x,center_y ,40,0,2*Math.PI); context.strokeStyle = "#990000"; context.stroke(); context.beginPath(); context.arc(center_x,center_y ,30,0,2*Math.PI); context.strokeStyle = "#0099CC"; context.stroke(); context.lineWidth = 1; x1 = 150; y1 = 150; r = 140; theta = 0.5; context.moveTo(x1, y1); context.lineTo(x1 + r * Math.cos(theta), y1 + r * Math.sin(theta)); context.stroke(); theta = 1; context.moveTo(x1, y1); context.lineTo(x1 + r * Math.cos(theta), y1 + r * Math.sin(theta)); context.stroke(); theta = 1.5; context.moveTo(x1, y1); context.lineTo(x1 + r * Math.cos(theta), y1 + r * Math.sin(theta)); context.stroke(); theta = 2; context.moveTo(x1, y1); context.lineTo(x1 + r * Math.cos(theta), y1 + r * Math.sin(theta)); context.stroke(); theta = 2.5; context.moveTo(x1, y1); context.lineTo(x1 + r * Math.cos(theta), y1 + r * Math.sin(theta)); context.stroke(); theta = 3; context.moveTo(x1, y1); context.lineTo(x1 + r * Math.cos(theta), y1 + r * Math.sin(theta)); context.stroke(); FLOAT号码存储在二进制中,而非十进制。这意味着您在该表达式中执行的所有其他操作都需要在二进制和十进制之间进行一次或多次转换。

0.5075 不能DOUBLE中完全表示 - 有或没有(16,2)

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

我的头旋转。

我希望你的确如此。

足够可能散步...当我尝试DOUBLE的变体时,我得到SET。我没有建立一个存储过程;我怀疑SP中还有其他问题。也许你可以建立一个完整的测试用例供我们使用?此外,您使用的是什么版本的MySQL - 在不太可能的情况下,该版本中的某些内容被破坏。