2015-12-02 151 views
1

我希望它每次选中(浇注)复选框时,都会通过增加额外的99便士来更新价格。除非用户选择了3个复选框(0.99 * 3),并且它显示的是2.9699999999999998而不是2.97,否则这一切都可以正常工作。JavaScript:parseFloat计算不正确

有什么不对?

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

['parseFloat'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseFloat)用于将*字符串*转换为浮点值。不像'parseInt',它*不具有第二个参数。 JavaScript实际上没有针对整数和浮点数的不同类型,它们都是相同的。所以,'parseFloat(checked)'does * nothing *。这实际上将'checked'转换为*字符串*然后转换为浮点数。 –

回答

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

尝试:parseFloat(x).toFixed(2)让我知道,如果你需要别的东西。

+0

@ AtheistP3ace不要忘记基数 –

+2

@SlinglingArcher不适用['parseFloat'](https://developer.mozilla。org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseFloat) – Matt

+0

哎呀!完全想'int' –

1

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

浮子越长,它越精确。大多数浮点数是具有23位尾数(小数部分或精度)的IEEE 754 standard的32位变体,以及一个8位指数,其实质上沿着尾数移动“浮动”小数点。

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

toppingCost.toFixed(2) 
1

这里做,这是一个想法乘以100的号码,然后除以100的结果:0.99*100*3/100 https://jsfiddle.net/qp21bpbs/1/

+0

这是一个好主意。你基本上以*美分而不是美元来对待所有的东西。 –

+0

P.S.你在jsFiddle中有*方法*太多'parseFloat's。不知道为什么。你可以(也应该)全部失去它们。 –

+0

@RocketHazmat只复制了问题并添加了100,我将美元换算为100美分,并将结果除以100基础数学 – madalinivascu

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

,您可以丢失'checkedInt'变量。 'parseFloat(checked,10)'是完全有用的。 –

+1

是的,你可以清理代码,我只是改变它的工作,“JQuery.length”应该返回一个Int :) 所以这应该工作得很好: 总= pizzaCost ++(checked * toppingCost)。 toFixed(2) –