在乘以数字时截断列的数据

时间:2016-08-18 13:42:19

标签: mysql

我在下面的数据上使用以下查询。但是,当我这样做时,我收到错误"数据被截断为列'力量'在第1行和第34行;对于每个列和行。我研究了一下,据我所知,大多数人都会收到此错误,因为他们正在尝试使用文本或字符。我之前从未见过这个警告,而且我得到了预期的结果,但有4,700个警告。

request.onload = function () {
    var txt = request.responseText + "\n//# sourceURL=" + file + "\n";
    try {
        var script = domDocument.createElement("script"),
        head = domDocument.head || domDocument.getElementsByTagName("head")[0];

        script.defer = true;
        script.text = txt;
        head.appendChild(script);
    } catch (e) {
        domWindow.onerror("Error loading js.", file, 0, 0, e, txt);
    }

    request.onload = function () { };
};

Database columns Database rows

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

strength * .999导致一个小数位数超过4的数字。这适用于所有这些计算。

要避免出现警告,您可以ROUNDTRUNCATE计算结果。例如:SET strength = ROUND(strength * .999, 4)SET strength = TRUNCATE(strength * .999, 4)

您可能想知道这两个功能之间的区别是什么;它是舍入行为。对于TRUNCATE,它会将数字向0舍入,而ROUND则取决于数值数据类型(精确或近似),在您的情况下为十进制(精确类型),会发生以下情况(取自Rounding Behavior):

  

对于精确值数字,ROUND()使用“round half up”规则:如果为正数,则小数部分为.5或更大的值将向上舍入到下一个整数,如果为负,则向下舍入到下一个整数。 (换句话说,它从零开始舍入。)小数小于.5的值向下舍入到下一个整数(如果为正)或者如果为负则向下舍入到下一个整数。

为了演示,这里是一个使用样本数据中用户4898的强度值的示例:

strength * .999 = 16331143.7521566 -- Over 4 decimal places, hence the warning
ROUND(strength * .999, 4) = 16331143.7522 -- Rounds up
TRUNCATE(strength * .999, 4) = 16331143.7521 -- Rounds down