我有一张表单供我的客户添加预算预测。一位知名用户希望能够以美元,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;
}
}
答案 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));
这很丑陋,但对于非金融系统来说已经足够接近了。