【问题标题】:javascript math, rounding to two decimal places in .05 incrementsjavascript 数学,以 0.05 为增量四舍五入到小数点后两位
【发布时间】:2011-09-22 05:51:08
【问题描述】:

我提前道歉。我已经阅读了许多帖子,我确信答案在于实现toFixed() 方法,但无法弄清楚如何。

$('.addsurcharge').click(function() {               
    $('span.depositamount').text(function(i,v) {
        return Math.round(parseInt(v * 100, 10) * 0.025) / 100 + (v * 1);
    });      
});

$('.nosurcharge').click(function() {            
    $('span.depositamount').text(function(i,v) {
        return Math.round(parseInt(v * 100, 10) * -0.025) / 100 + (v * 1);
    });      
});

基本上,以上是对 AMEX 存款添加(或减去)2.5% 的附加费,我希望它四舍五入到最接近的小数点后两位。最好以 0.05 为增量。

帮助表示赞赏!

【问题讨论】:

  • 不完全确定“以 0.5 为增量”是什么意思。你能详细说明一下吗?
  • 我不明白您对“两位小数”和“0.5 增量”的要求。后者不会是 1、1.5、2、2.5 等吗?你能用一些四舍五入前后的例子更好地解释一下吗?另外,你为什么使用parseInt(v * 100,10)?如果 v 是小数,它将乘以 100 并将 向下 舍入到最接近的整数(因为 parseInt 会丢弃第一个非数字之后的所有内容);如果 v 是一个整数,它是没有意义的;如果 v 不是数字,它根本不起作用。
  • 感谢您的回复。我的错误,应该写 0.05 inrements。这是针对澳大利亚网站的,这里的所有货币都以 0.05 为增量(5c 是最小的硬币)。不确定第二个问题,我基本上是按原样继承了上面的代码,我只是想解决小数问题。如果有更实用的解决方案,很乐意改变 - 你可能已经猜到了,这不是我的专业领域。
  • 作为一个澳大利亚人,我不得不反驳你关于这里所有货币都是 0.05 增量的说法。所有 现金 付款都以 0.05 为增量,因为我们最小面额的硬币是 5c,但任何电子交易,或老式纸质信用卡或支票交易(显然包括美国运通交易)都是到最近的一分钱。除非您的客户支付现金,否则不要考虑四舍五入到最接近的 5 美分。
  • 我理解你的观点,并不反对。在这个特定的实施方式中,金额是小额存款,通常是整美元。为了简化会计和用户体验,我只是想避免使用小数。感谢您的反馈。

标签: javascript jquery math decimal rounding


【解决方案1】:

货币最简单的方法是使用次要单位,然后四舍五入并仅在最后转换为主要单位。因此,对于具有美元和美分的系统,以美分工作直到结束,然后转换为美元。如果要输入的文本格式为“2.03”,则可以使用以下方法将其四舍五入到最接近的 0.05 美元:

function roundToFiveCents(v) {

  // Turn dollars into cents and convert to number
  var len;
  v = v * 100;

  // Get residual cents
  var r = v % 5;

  // Round to 5c
  if (r) {
    v -= (r == 1 || r == 2)? r : r-5;
  }

  // Convert to string
  v = v + '';
  len = v.length - 2;

  // Return formatted string
  return v.substring(0, len) + '.' + v.substring(len);
}

这可以更简洁,但我看不出重点,它只会让服务器混淆。字符串操作非常快,用简单的加减法代替了 javascript 小数乘除的不确定性。

例如借用 rfausak 的回答:

// Returns string, remove ' + ''' to return number
function roundToFiveCents(v) {
  return (Math.round(v*20)/20).toFixed(2) + '';
}

【讨论】:

    【解决方案2】:

    如果您的问题是“我如何获取包含美元和美分金额的变量 v,并应用 2.5% AMEX 附加费,结果四舍五入到最接近的美分(即两位小数) ?”然后你可以试试这个:

    return (v * 1.025).toFixed(2);
    

    如果您有可变附加费,试试这个:

    var surcharge = 0.025; // or whatever percentage applies
    
    return (v * (1 + surchage)).toFixed(2);
    

    请注意,toFixed 返回一个字符串表示,但它会为您进行四舍五入。

    (关于您的“无附加费”功能,您无法通过乘以 -0.025 来移除之前应用的 0.025 附加费。您通过乘以 1.025 来应用附加费,因此您可以通过除以 1.025 来移除它。)

    【讨论】:

    • 感谢您的回复。我已经尝试逐字使用您的代码,但它会导致错误:'undefined' is not a function (evaluating 'Math.toFixed(parseInt(v * 1.025, 2))') - 明天我会以清醒的头脑更好地破解它,为抢占先机而欢呼。
    • 很抱歉,我忘记了语法是yourNumber.toFixed(numOfPlaces),而不是Math.toFixed()。我已经相应地更新了我的答案。注意:您需要停止使用parseInt:您使用它的方式导致计算中间进行舍入,您不想在最后一步之前进行舍入。
    【解决方案3】:

    虽然帖子有点旧,但问题不是。 我认为海报的意思是,某些货币以美分计算,但价格以 x.00 或 x.05 美分给出。例如瑞士货币。

    解决方案,借用了 RobG 的回答并稍作修正:

    function roundToFiveCents(v) {
        var len;
        // Format to 2 numbers after decimal point an turn dollars into cents
        v = v.toFixed(2) * 100;
    
        // Get residual cents
        var r = v % 5;
    
        // Round to 5c
        if (r) {
            v -= (r === 1 || r === 2) ? r : r - 5;
        }
    
        // Convert to string
        v = v + '';
        len = v.length - 2;
    
        // Return formatted string
        return v.substring(0, len) + '.' + v.substring(len);
    }
    

    【讨论】:

      【解决方案4】:

      下面的javascript怎么样:

      function my_round(x) {
          x *= 20;
          x = Math.ceil(x);
          return x / 20;
      }
      var amount = 3.37;
      alert(my_round(amount));
      

      【讨论】:

      • 用 Math.round() 替换 Math.ceil(),然后正确格式化输出。
      • 嗯,他在他的帖子中提到“我希望它四舍五入到最接近的两位小数”。目前尚不清楚他的意思是什么。
      【解决方案5】:
      var n = 8.22354;
      roundx(n, 3)
      
      function roundx(num, decPlace) {
        return Math.round(num * Math.pow(10, decPlace))/Math.pow(10, decPlace);
      }
      

      这个简单的函数非常适合四舍五入到 x 位数。

      【讨论】:

        猜你喜欢
        • 2013-03-23
        • 1970-01-01
        • 2014-09-12
        • 2022-01-02
        • 2017-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多