JavaScript:parseFloat计算错误



我希望每次选中(浇头)复选框时,它都会额外添加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);
});

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

JavaScript实际上没有不同的int和float类型,它们都是相同的(并且作为float存储在内部)。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));
});

浮点数字很少是精确的。它们通过表示一个误差最小的数字来工作——有点像压缩。这与某些语言中的Decimal数据类型形成了鲜明对比,后者确实像整数一样存储每个数字,甚至超过了小数。

浮点值越长,它就越精确。大多数浮点值是IEEE 754标准的32位变体,它有一个23位尾数(小数部分或精度)和一个8位指数,它基本上沿着尾数移动"浮动"小数点。

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

toppingCost.toFixed(2) 

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

try:parseFloat(x).toFixed(2)如果您需要其他东西,请告诉我。

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);
});

最新更新