JavaScript:parseFloat计算不正确

时间:2015-12-02 17:51:01

标签: javascript jquery html

我希望每次选中(浇头)复选框时,它会通过添加额外的99便士来更新价格。一切正常,除非用户选择3个复选框(0.99 * 3)并显示2.9699999999999998而不是2.97

关于什么是错的任何想法?

HTML:

<label><b>Toppings (99p Each): &nbsp;</b></label><br>
<input type="checkbox" name="onions">Onions</input><br>
<input type="checkbox" name="mushrooms">Mushrooms</input><br>
<input type="checkbox" name="peppers">Peppers</input><br>
<input type="checkbox" name="olives">Olives</input><br>
<input type="checkbox" name="garlic">Garlic</input><br>
<input type="checkbox" name="xtra-cheese">Xtra Cheese</input><br>
<input type="checkbox" name="peperoni">Peperoni</input><br>

JavaScript的:

var pizzaCost = 0.00;
var toppingCost = 0.00;

$('input[type=checkbox]').change(function(){
    var checked = $(":checkbox:checked").length;
    var checkedInt = parseFloat(checked, 10);
    var temp = (0.99 * checkedInt);
    toppingCost = parseFloat(temp);
    var total = pizzaCost + toppingCost;
    $("#totalPrice").text(total);
});

5 个答案:

答案 0 :(得分:4)

parseFloat用于将字符串转换为浮点值。与parseInt不同,parseFloat 具有第二个参数。

JavaScript实际上没有针对整数和浮点数的不同类型,它们都是相同的(并在内部存储为浮点数)。 parseFloatparseInt之间的唯一区别是返回的number是否应该包含小数部分。

您要在此处使用的是toFixed(),此处根本不需要parseFloat。您无需解析字符串

$('input[type=checkbox]').change(function(){
    var checked = $(":checkbox:checked").length;
    toppingCost = 0.99 * checked;

    var total = pizzaCost + toppingCost;
    $("#totalPrice").text(total.toFixed(2));
});

答案 1 :(得分:1)

浮点数很少是准确的。它们通过表示具有最小可能错误的数字来工作 - 有点像压缩。这与某些语言中的Decimal数据类型形成对比,这些数据类型确实存储了每个数字,如整数,甚至超过了小数。

浮子越长,它就越精确。大多数浮点数是IEEE 754 standard的32位变体,它具有23位尾数(小数部分或精度),以及一个8位指数,它基本上移动了#34;浮动&#34;沿着尾数的小数点。

这对您来说意味着2.97不能用浮点数表示,没有很小的误差。为了得到2.97,你需要将结果舍入到2d.p.在JavaScript中,您可以使用

执行此操作
toppingCost.toFixed(2) 

答案 2 :(得分:1)

这是一个想法将数字乘以100然后将结果除以100:0.99*100*3/100 https://jsfiddle.net/qp21bpbs/1/

答案 3 :(得分:0)

尝试:parseFloat(x).toFixed(2)如果您需要其他内容,请告诉我。

答案 4 :(得分:0)

parseFloat是将字符串解析为浮点值,以获得一些你应该使用toFixed的格式化浮点数,如下所示:

var pizzaCost = 0.00;
var toppingCost = 0.00;

$('input[type=checkbox]').change(function(){
    var checked = $(":checkbox:checked").length;
    var checkedInt = parseFloat(checked, 10);
    var temp = (0.99 * checkedInt);
    toppingCost = +temp.toFixed(2); // Assuming 2 decimals
    var total = pizzaCost + toppingCost;
    $("#totalPrice").text(total);
});