2015-12-02 77 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) –