10

每次有人结账时,我兄弟的电子商务网站上的一些 js 都会计算并存储交易总额。定期为 tracker_total_amount 存储一个负值。当他试图找出原因时,他决定硬编码一个覆盖,该覆盖应该解决大约 0.1% 的具有无意义值的交易。它看起来像这样:

var tracker_total_amount = parseFloat(tracker.total_amount).toFixed(2);
    if(tracker_total_amount < 0){
        tracker_total_amount = 0;
    }

负值继续出现在系统中。

原理论:

我认为他不应该使用 .toFixed,因为这会将 tracker_total_amount 转换为字符串 - 在我看来,这会阻止 if < 0 条件按预期工作。在我测试它并且覆盖工作之前,我对这个解释非常满意。见这里:http: //jsfiddle.net/yXTrz/

新理论:

不同的用户正在运行不同版本的 javascript。一些非常小的子集使用古老版本的 javascript(而不是像我正在做的那样将字符串转换为浮点数)继续将其视为字符串并始终将 tracker_total_amount 评估为 > 0,从而防止覆盖触发。

问题:

旧版本的 javascript 是否以这种方式运行?一些用户还能运行那些旧版本吗?最重要的是 - 有没有一种方法可以模拟旧版本的 javascript 来证明我的理论?

编辑:我应该指出所有重要的东西(付款等)都依赖于服务器端的计算值。这里的数字只是之后存储在 Google Analytics 中的数据,所以——虽然可以操纵——结果不会太糟糕。

4

3 回答 3

2

您可以通过非常小的负值,即 -0.001,因为该值被设置为固定值。不确定您看到的是哪种底片,但任何超出固定值的底片都将允许底片通过。对不起,应该更清楚,如果有进一步的计算不使用返回值而不是原始值......返回值将是-0.00......所以如果这只是用作测试......

于 2013-09-10T21:48:20.817 回答
1
  • 关于“为什么”:@Kevin 的答案是正确的,您可以在链接到的代码上进行检查。
  • 关于“如何解决它”:@Nerdwood 的回答很棒。以数字类型进行所有计算(按预期进行舍入),并且仅在边界处转换。

但我想补充两点要检查:

  • 确保您的 JS 代码版本正确,这样客户端浏览器就不会在没有“修复”的情况下获取缓存版本。
  • 确保此字段未在其他地方设置或更新。
于 2013-09-11T13:15:32.660 回答
1

不确定旧版本的 Javascript 是否以不同的方式处理您的数字的字符串表示形式,但您应该能够通过toFixed()在检查数字是否在范围内后使用来解决问题:

var tracker_total_amount = parseFloat(tracker.total_amount);
if (tracker_total_amount < 0) {
    tracker_total_amount = 0;
}
tracker_total_amount = tracker_total_amount.toFixed(2);
于 2013-09-11T01:06:39.303 回答