用小数计算价格

时间:2014-06-27 15:08:27

标签: jquery

我正在编写一个脚本来计算表面的价格,比如' m2'。下面是我的脚本,但我想要的是欧元是2位小数。我怎样才能解决这个问题?我已经尝试过parseFloat()和toFixed(2),但我认为它并没有在正确的地方过去。

var surface;
var totalPrice;

function calculateSurface() {
    var length = document.getElementById("length").value;
    var width = document.getElementById("width").value;

    surface = length * width;
} 


function calculatePrice() {
    var area = $('#area').val();

    if(area=='pur3') {
        totalPrice = surface * 16;
    }

    else if(area=='pur4') {
        totalPrice = surface * 17.50;
    }

    else if(area=='pur5') {
        totalPrice = surface * 19;
    }

    else if(area=='pur6') {
        totalPrice = surface * 21;
    }

    else if(area=='pur7') {
        totalPrice = surface * 23.50;
    }

}

function showResults() {
    return surface + '  ' + totalPrice;
}


$("#calc").click(function(e) {
    e.preventDefault();
    calculateSurface();
    calculatePrice();   
    $('.result').html('Aantal oppervlakte: ' + surface + ' m&sup2;' + '<br>' + '&euro; ' + totalPrice + '' );

});

3 个答案:

答案 0 :(得分:2)

就像它说的那样,你应该只在打印任何东西时圆。始终保持实际计算值,以避免精度损失。实际上,在保存数据时,您应该保存参数而不仅仅是结果,因为如果需要,您可以随时使用原始参数重新计算。

jsfiddle为例:

var areaBasePrice = {
  'pur3': 16,
  'pur4': 17.50,
  'pur5': 19,
  'pur6': 21,
  'pur7': 23.5
};

function calculateSurface() {
  var length = $("#length").val();
  var width = $("#width").val();

  return length * width;
} 

function calculatePrice() {
  var area = $('#area').val();

  return areaBasePrice[area] * calculateSurface();
}

$("#calc").click(function(e) {
    var surface = calculateSurface();
    var price = calculatePrice();

    $('.result').html('Aantal oppervlakte: ' + surface + ' m&sup2;' + '<br>' + '&euro; ' + price.toFixed(2) );

    e.preventDefault();
});

修改

关于浮动值精度损失的说明。除非你是在为一家拥有许多关键交易的银行公司工作,否则你应该真的不要担心四舍五入的价值(向上或向下)。如果您这样做,则发送您的参数服务器端和/或使用适当的货币操作库来满足您的需求。

答案 1 :(得分:0)

像以前提到的Niet一样,使用整数进行金钱交易。二进制数不能准确地表示一些浮点数(.20结束数字会浮现在脑海中)。

所以你的所有价值都变成你以前的价值* 100,所以:

if(area=='pur3') {
    totalPrice = surface * 1600;
}

else if(area=='pur4') {
    totalPrice = surface * 1750;
}

else if(area=='pur5') {
    totalPrice = surface * 1900;
}

else if(area=='pur6') {
    totalPrice = surface * 2100;
}

else if(area=='pur7') {
    totalPrice = surface * 2350;
}

然后当您显示价格时,除以100并将其固定为2位小数:

$("#calc").click(function(e) {
  e.preventDefault();
  calculateSurface();
  calculatePrice();
  var fixedPrice = (totalPrice/100).toFixed(2);
  $('.result').html('Aantal oppervlakte: ' + surface + ' m&sup2;' + '<br>' + '&euro; ' + fixedPrice + '' );
});

或类似的东西。

答案 2 :(得分:0)

如果您试图强制使用2位小数,.toFixed()将无法帮助您处理不需要该精度的数字(即3.5)。我为这个场景创建了一个JSFiddle:

http://jsfiddle.net/f38ww/3/

更新了JS:

function formatCurrency ( number ) {
    return Math.floor(number) + '.' + (Math.floor(number % 1 * 100) || '00');
}

function calculateSurface() {
    return $('#length').val() * $('#width').val();
}

function calculatePrice(surface) {
    var lookup = {
        pur3: 16,     pur4: 17.5,
        pur5: 19,     pur6: 21,
        pur7: 23.5
    };
    return surface * lookup[$('#area').val()];
}

$("#calc").click(function(e) {
    e.preventDefault();
    var surface = calculateSurface(),
        price = calculatePrice(surface);
    $('.result').html(
        'Aantal oppervlakte: ' + surface +
        ' m&sup2;<br>&euro; ' + formatCurrency(price)
    );
});