我在Flash中有两个按钮。目的是当你点击一个时,计数器将上升1.9,如果你点击另一个,它将下降1.9。但是,当您尝试将数字增加/减少1.9时,只需点击几下,数学就会略微偏离。该数字应该是一个或两个小数。
var count1:uint = 0;
var unit:Number = 0;
add1_btn.addEventListener(MouseEvent.CLICK, add1);
take1_btn.addEventListener(MouseEvent.CLICK, take1);
counter1.text = '0';
function add1(event:Event):void
{
count1++;
counter1.text = count1.toString();
unit+= 1.9;
var unitRound= int((unit)*10)/10;
units.text = unitRound.toString();
}
function take1(event:Event):void
{
count1--;
counter1.text = count1.toString();
unit-= 1.9;
var unitRound= int((unit)*10)/10;
units.text = unitRound.toString();
}
答案 0 :(得分:1)
您遇到的是Flash添加浮点数的方法的十进制不精确。
要解决此问题,您可以执行以下操作。我只是简单地改变了添加的方式,因此,它允许我摆脱你正在使用的unitRound
变量,同时仍然保持你需要的单个小数精度。
var count1:uint = 0;
var unit:Number = 0;
add1_btn.addEventListener(MouseEvent.CLICK, add1);
take1_btn.addEventListener(MouseEvent.CLICK, take1);
counter1.text = '0';
function add1(event:Event):void
{
count1++;
counter1.text = count1.toString();
unit = ((unit*10) + 19)/10;
units.text = unit.toString();
}
function take1(event:Event):void
{
count1--;
counter1.text = count1.toString();
unit = ((unit*10) - 19)/10;
units.text = unit.toString();
}
另一个轻微清洁方法I came across,它做了类似我提出的方法,但如果需要更容易修改:
var count1:uint = 0;
var unit:Number = 0;
add1_btn.addEventListener(MouseEvent.CLICK, add1);
take1_btn.addEventListener(MouseEvent.CLICK, take1);
counter1.text = '0';
function add1(event:Event):void
{
count1++;
counter1.text = count1.toString();
unit = toFixed(unit + 1.9,10);
units.text = unit.toString();
}
function take1(event:Event):void
{
count1--;
counter1.text = count1.toString();
unit = toFixed(unit - 1.9,10);
units.text = unit.toString();
}
var toFixed:Function = function(number:Number, factor:int) {
return Math.round(number * factor)/factor;
}
答案 1 :(得分:1)
这是您在处理十进制值时在任何计算机上遇到的情况。
所有编程语言中最简单的解决方法可能是将解决方案重写为以下内容: (关键是保持你正在迭代的东西清除小数点,然后将它与某些东西相乘得到“最终”值。)
var _index:int = 0;
add1_btn.addEventListener(MouseEvent.CLICK, add1);
take1_btn.addEventListener(MouseEvent.CLICK, take1);
counter1.text = '0';
function add1(event:Event):void
{
_index++;
units.text = (_index * 1.9).toString();
}
function take1(event:Event):void
{
_index--;
units.text = (_index * 1.9).toString();
}