应用程序脚本的虚假数学

时间:2013-01-27 00:36:43

标签: google-apps-script

使用Google Apps脚本时,是否存在使用虚假数学结果的问题?以下是代码,其中a / b / c是从另一个函数发送的。使用记录器验证A / b / c。 ? StartPt很好,但是endpt正在生成一个假值。

function calcTime(a,b,c)  {
  var x;
  var startHr = 8;
  var startMin = 0;
  var startSec=0;
  var startPt;
  var endPt; 
  startPt = (startHr * 60) + startMin + (startSec/60);
  endPt = (a * 60) + b + (c/60);
  Logger.log(endPt);
  x = endPt -startPt;

  return x;
}

flag

我发现数学误差是乘法因子100(当计算endPt时,它将结果乘以100)。什么可能导致这种情况?

1 个答案:

答案 0 :(得分:2)

实数运算很容易在javascript和apps脚本中舍入错误。见Is floating point math broken?。如果你在调试器中观察你的功能,你会看到舍入错误。与(c/60)。但这不太可能导致100倍的误差。

最有可能的是,你的参数不是你的意思。例如,如果b作为字符串到达​​,则(a * 60) + b + (c/60)的计算将有效地忽略b。但是,其他两个参数将更改为数字以完成乘法和除法运算。 (您可以使用b * 1来避免这种情况。)

无论如何,要确认您获得的参数是什么,请尝试用此替换函数的前几行:

function calcTime(a,b,c)  {
  var params = {
    a:{type:typeof a, value:a},
    b:{type:typeof b, value:b},
    c:{type:typeof c, value:c}}
  Logger.log(params);
  var x;
  ...

验证您是否得到了所需的信息。例如,如果任何参数作为日期对象到达,那么您的数学将非常不正确。您可能只需要为数据源强制执行类型。