2010-06-02 14 views
1

У меня есть форма для моих клиентов, чтобы добавить бюджетные прогнозы. Известный пользователь хочет иметь возможность показывать долларовые ценности в долларах, долларах Kila или Mega-долларах.Проблема с 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

Эмм, в чем проблема? –

+0

@BlueRaja: Я могу сказать, что вы не использовали поплавки javascript. Совсем редко бывает 2.10 + 5.15 = 7.24999999999999999999999999999999999999999. Довольно унизительно. Я когда-то сделал сайт, который продал объявление, которое обвинялось в этом слове, и как-то .10 центов раз 200 слов равнялись бы 19.999999999999999999 долларов. – Satanicpuppy

+0

Возможно, округление FP. .000001 не совсем .000001, и иногда вы получите результаты, такие как 450.2500001, где вы хотели 450.25. – cHao

ответ

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

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

Смежные вопросы