mobile Safari iOS 6上奇怪的JavaScript行为

mobile Safari iOS 6上奇怪的JavaScript行为,javascript,math,mobile-safari,ios6,Javascript,Math,Mobile Safari,Ios6,我遇到了一个非常奇怪的JS问题,它只在iOS 6上的Mobile Safari浏览器上重现。 问题在于函数将给定值格式化为价格,方法是将数字拆分为2位小数,并在数字前面添加货币。下面是函数。稍后我将解释如何复制该bug formatCurrency = function(value, currency, fixedPrecision, colourize, blankIfZero) { var text; if (blankIfZero && (Math.abs

我遇到了一个非常奇怪的JS问题,它只在iOS 6上的Mobile Safari浏览器上重现。 问题在于函数将给定值格式化为价格,方法是将数字拆分为2位小数,并在数字前面添加货币。下面是函数。稍后我将解释如何复制该bug

formatCurrency = function(value, currency, fixedPrecision, colourize, blankIfZero) {
    var text;

    if (blankIfZero && (Math.abs(value) < 0.01 || value === undefined)) {
         return "";
    }

    if (fixedPrecision) {
        text = currency + Math.abs(value).toFixed(2);
    } else {
        text = currency + roundTo2Decimals(Math.abs(value));
    }

    if (value < 0) {
        text = "-" + text;
    }

    if (colourize) {
        var colorClass = (value < 0 ? "negative" : "positive");
        text = "<span class='" + colorClass + "'>" + text + "</span>";
    }

    return text;
};

roundTo2Decimals = function(value) {
    var sign = value < 0 ? -1 : 1;
    return Math.round(Math.abs(value) * 100.0)/100.0 * sign;    
};
formatCurrency=函数(值、货币、固定精度、着色、blankIfZero){
var文本;
if(blankIfZero&(Math.abs(值)<0.01 | |值==未定义)){
返回“”;
}
if(固定精度){
text=货币+数学.abs(值).toFixed(2);
}否则{
text=currency+roundTo2Decimals(Math.abs(value));
}
如果(值<0){
text=“-”+文本;
}
如果(着色){
var colorClass=(值<0?“负”:“正”);
text=”“+text+”;
}
返回文本;
};
roundTo2Decimals=函数(值){
var符号=值<0?-1:1;
返回数学四舍五入(数学绝对值)*100.0)/100.0*符号;
};
如果我使用相同的值(比如说value=1;和currency=“GBP”)反复运行formatCurrency函数(例如在setInterval内),您会注意到每800-1000次迭代,函数返回的值就包含一个负值:GBP-1而不是GBP1。这个问题很烦人,我在JS函数中没有发现任何问题

我设法解决了这个问题。。。但是我很好奇这个实现有什么问题。[编辑:我通过删除“roundTo2Decimals(Math.abs(value))”中的“-”字符解决了这个问题。但是“-”字符本来就不应该出现。因此,这个修复实际上是一个解决方法。]

我错过了什么吗?

我想

text=“-”+字符串(文本)

这就是问题所在

我也在Safari上浏览了很多与iOS6相关的bug。如果我们想让JS顺利执行,它看起来应该更干净

我猜

text=“-”+字符串(文本)

这就是问题所在


我也在Safari上浏览了很多与iOS6相关的bug。如果我们想让JS顺利执行,它看起来应该更干净

如果您找到了解决方案/解决方法,请将其作为答案发布,以便其他人可以从中受益。对于任何其他遇到此错误的人,我相信我有一个重复的案例,如果不是解决方案:请注意,blankIfZero绕过小值的舍入代码,从而导致不一致的结果。也就是说,0.009将返回空字符串“0.01”,而1.009将返回“1.01”。此检查应<0.005如果您找到了解决方案/解决方法,请将其作为答案发布,以便其他人可以从中受益。对于遇到此错误的任何人,我相信我有一个重复的案例,如果不是解决方案:请注意,blankIfZero绕过小值的舍入代码,从而导致不一致的结果。也就是说,0.009将返回空字符串“0.01”,而1.009将返回“1.01”。该检查应<0.005请记住,发生问题时“-”符号位于货币代码(GBP-10)之后,而不是货币代码(-GBP-10)之前。“text=“-”+字符串(text);”将在货币前面加上“-”号。请记住,发生问题时“-”号在货币代码(GBP-10)后面,而不是货币代码(-GBP-10)前面。“text=“-”+字符串(text);”将在货币前面加上“-”号。