2010-06-02 67 views
1

我有一個表格可以讓我的客戶添加預算預測。一位知名用戶希望能夠以美元,千基金或兆美元顯示美元價值。JavaScript算術問題

我試圖用一組調用以下JavaScript函數的單選按鈕來達到這個目的,但是由於四捨五入使得結果看起來很糟糕。

任何意見將不勝感激!

林恩

function setDollars(new_mode) 
{ 
    var factor; 
    var myfield; 
    var myval; 

    var cur_mode = document.proj_form.cur_dollars.value; 

    if(cur_mode == new_mode) 
    { 
    return; 
    } 
    else if((cur_mode == 'd')&&(new_mode == 'kd')) 
    { 
    factor = "0.001"; 
    } 
    else if((cur_mode == 'd')&&(new_mode == 'md')) 
    { 
    factor = "0.000001"; 
    } 
    else if((cur_mode == 'kd')&&(new_mode == 'd')) 
    { 
    factor = "1000"; 
    } 
    else if((cur_mode == 'kd')&&(new_mode == 'md')) 
    { 
    factor = "0.001"; 
    } 
    else if((cur_mode == 'md')&&(new_mode == 'kd')) 
    { 
    factor = "1000"; 
    } 
    else if((cur_mode == 'md')&&(new_mode == 'd')) 
    { 
    factor = "1000000"; 
    } 

    document.proj_form.cur_dollars.value = new_mode; 

    var cur_idx = document.proj_form.cur_idx.value; 
    var available_slots = 13 - cur_idx; 
    var td_name; 
    var cell; 
    var new_value; 

    //Adjust dollar values for projections 
    for(i=1;i<13;i++) 
    { 
    var myfield = eval('document.proj_form.proj_'+i); 
    if(myfield.value == '') 
    { 
     myfield.value = 0; 
    } 
    var myval = parseFloat(myfield.value) * parseFloat(factor); 
    myfield.value = myval; 
    if(i < cur_idx) 
    { 
     document.getElementById("actual_"+i).innerHTML = myval; 
    } 
} 
+0

呃,什麼問題? – 2010-06-02 22:24:32

+0

@BlueRaja:我可以告訴你沒有使用JavaScript浮動。擁有2.10 + 5.15 = 7.249999999999999999999999999999999999999是很常見的。非常羞恥。我曾經做過一個網站,出售一個廣告,收費的話,不知何故.10美分200字等於19.999999999999999999美元。 – Satanicpuppy 2010-06-02 22:31:40

+0

可能是FP舍入。 0.000001並不是0.000001,偶爾你會得到450.2500001這樣的結果,你想要450.25。 – cHao 2010-06-02 22:34:26

回答

1

JavaScript的浮點數是刺激的根源。

你應該嘗試添加toFixed(),以減少不可避免荒謬小數,而我實際上已經不得不求助於強迫它做它的捨去,我不要做這樣的事情關心它:

number_to_be_rounded = Math.round(number_to_be_rounded*1000)/1000; 
    number_to_be_rounded = parseFloat(number_to_be_rounded.toFixed(2)); 

這很醜陋,但它足夠接近非金融系統。

+0

謝謝!這非常有幫助! – Lynn 2010-06-04 21:58:07

3

首先,不要設置myfield.value = myval做數學後。每添加一個單選按鈕,您都會累積舍入誤差。保持myfield.value爲美元,然後計算顯示的值。這也將減少if-else級聯中的個案數量,因爲您將始終將美元轉換成。

現在按部門計算 - 您將永遠不必乘以0.001或1000,因爲您總是在同一方向轉換。

使用Math.round()來控制舍入誤差。您可以先乘以原始值,然後除以更大的因子,以幫助控制舍入誤差;例如這兩個是相同的純數學:

newvalue = value/1000; 
newvalue = (value * 10)/10000; 

新增

switch (new_mode) 
{ 
    case 'd': 
     divisor = 1; 
     break; 
    case 'kd': 
     divisor = 1000; 
     break; 
    case 'md': 
     divisor = 1000000; 
     break; 
} 
var displayValue = myfield.value/divisor; 

而且,不分配的一串數字divisor = "1000";用實際的數字divisor = 1000(不帶引號)

+0

謝謝斯蒂芬。這非常有幫助! – Lynn 2010-06-04 21:58:47