我兄弟的电子商务网站上的一些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&lt; 0条件按预期工作。在我测试它并且覆盖工作之前,我对这个解释非常满意。见这里:http://jsfiddle.net/yXTrz/
新理论:
不同的用户正在运行不同版本的javascript。一些非常小的子集使用古老版本的javascript(而不是像我一样将字符串转换为浮点数)继续将其视为字符串,并始终将tracker_total_amount评估为&gt; 0,防止覆盖被触发。
问题:
旧版本的javascript是否以这种方式运行?有些用户仍然可以运行这些旧版本吗?最重要的是 - 有没有一种方法可以模拟遗留版本的javascript来证明我的理论?
编辑:我应该指出所有重要的东西(付款等)都依赖于服务器端的计算值。这里的数字就是之后存储在Google Analytics中的数据,因此 - 虽然可以操作 - 但结果不会太糟糕。
答案 0 :(得分:2)
您可以获得非常小的负值,即-0.001,因为该值设置为固定。不确定你看到了什么样的负面影响,但任何超出固定值的负面影响将允许负面影响。对不起,应该更清楚,如果有进一步的计算不使用返回的值而不是原始值...返回的值将是-0.00 ...所以如果这只是用作测试...
答案 1 :(得分: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);
答案 2 :(得分:1)
但我想补充两点来检查: