JavaScript算法的问题

时间:2010-06-02 22:13:23

标签: javascript

我有一张表单供我的客户添加预算预测。一位知名用户希望能够以美元,Kila-dollar或Mega-dollar显示美元价值。

我正在尝试通过一组调用以下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;
   }
 }

2 个答案:

答案 0 :(得分:3)

首先,不要在进行数学运算后设置myfield.value = myval。您将在每个附加选择一个单选按钮时累积舍入错误。将myfield.value始终保持为美元,然后计算 display 值。这也将减少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(不含引号)

答案 1 :(得分: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));

这很丑陋,但对于非金融系统来说已经足够接近了。