截断Actionscript编号

截断Actionscript编号,actionscript,Actionscript,我在actionscript中有一个数字,是通过一些任意数学得出的: var value:Number = 45 * (1 - (1 /3)); trace(value);//30.00000000004 现在,我想取这个数字的上限,除非它大于下一个较低的整数,小于某个ε。在上面的例子中,我真的想舍入到30,但只有在我知道我得到舍入误差的情况下: Math.ceil(value); //I want 30, but get 31 Math.ceil(30.1); //In this case

我在actionscript中有一个数字,是通过一些任意数学得出的:

var value:Number = 45 * (1 - (1 /3));
trace(value);//30.00000000004
现在,我想取这个数字的上限,除非它大于下一个较低的整数,小于某个ε。在上面的例子中,我真的想舍入到30,但只有在我知道我得到舍入误差的情况下:

Math.ceil(value); //I want 30, but get 31
Math.ceil(30.1);  //In this case, it's reasonable to get 31

有没有一种优雅的方法可以截断actionscript中的数字?或者轻易地丢弃数字中小于某个ε的任何部分?

此方法对您有帮助吗

var value:Number = 45 * (1 - (1 /3));
trace(value);//30.00000000004

// Play with arbitraryPrecision until you are satisfied with
// the accuracy of your results
var arbitraryPrecision:int = 3;
var fixed:Number = value.toFixed(arbitraryPrecision);

trace(Math.ceil(fixed));
var precision:int = 4;
var isActualCeilingValRequred:Boolean;
var thresholdValForCeiling:int = 100;

private function getCeilingValue(num:Number):Number
{
  var tempNum = num * Math.pow(10, precision);
  var decimalVal = tempNum % Math.pow(10, precision);

  if(decimalVal < thresholdValForCeiling) {
    return Math.floor(num);
  } else {
    return Math.Ceil(num);
  }
}
var精度:int=4;
变量isActualCeilingValRequred:布尔值;
var thresholdValForCeiling:int=100;
私有函数getCeilingValue(num:Number):Number
{
var tempNum=num*Math.pow(10,精度);
var decimalVal=tempNum%数学功率(10,精度);
if(小数值<阈值值强制){
返回Math.floor(num);
}否则{
返回Math.Ceil(num);
}
}

此方法对您有帮助吗

var precision:int = 4;
var isActualCeilingValRequred:Boolean;
var thresholdValForCeiling:int = 100;

private function getCeilingValue(num:Number):Number
{
  var tempNum = num * Math.pow(10, precision);
  var decimalVal = tempNum % Math.pow(10, precision);

  if(decimalVal < thresholdValForCeiling) {
    return Math.floor(num);
  } else {
    return Math.Ceil(num);
  }
}
var精度:int=4;
变量isActualCeilingValRequred:布尔值;
var thresholdValForCeiling:int=100;
私有函数getCeilingValue(num:Number):Number
{
var tempNum=num*Math.pow(10,精度);
var decimalVal=tempNum%数学功率(10,精度);
if(小数值<阈值值强制){
返回Math.floor(num);
}否则{
返回Math.Ceil(num);
}
}

将数字四舍五入到指定小数位数的基本方法是将数字乘以10^位数,将小数点向左移动,执行四舍五入,然后除以相同的10^位数,将小数点向右移动

var value:Number = 45 * (1 - (1 / 3));
trace(value); // 30.000000000000004
trace(Math.ceil(value)); // 31
// Round the number to 13 decimal digits.
const POWER:Number = 1e13;
value = Math.round(value * POWER) / POWER;
trace(value); // 30
// Compute number's ceiling.
value = Math.ceil(value);
trace(value); // 30`
这对你的例子很有用,但有一个很大的问题。如果将值更改为
450*(1-(1/3)),您原来的问题将再次出现。现在要去掉它,你必须四舍五入到12位小数。基本上,双精度格式(数字)的有效位可以容纳大约15位有效数字。这意味着,当值增加10倍时,小数点向左移动,最后一个要删除的“4”位数将越来越接近小数点。因此,代码变得更加复杂

var value:Number = 450 * (1 - (1 / 3));
trace(value); // 30.000000000000004
trace(Math.ceil(value)); // 31
var exp:Number = Math.floor(Math.log(Math.abs(value)) * Math.LOG10E);
trace('exp=' + exp); // exp=2
const POWER:Number = Math.pow(10, 14 - exp);
value *= POWER;
trace(value); // 300000000000000.06
value = Math.round(value);
trace(value); // 300000000000000
value /= POWER;
trace(value); // 300
正如您所看到的,无论值的大小,它现在都可以工作。
首先,我通过对数字的绝对值取一个以10为底的对数,然后四舍五入来计算数字的指数。如果您计算
a=value*Math.pow(10,exp),则值可以表示为*10^b,其中(1≤ |a |<10),称为规范化科学记数法。但这不是我们在这里要做的。现在我们知道小数点左边有多少位,我们将把小数点向右移动,但不要太远,以保持一个0和这个我们想要去掉的错误数字,在小数点的右边。因此,乘以10^(14 exp),四舍五入,然后除以相同的幂。

将一个数字四舍五入到指定的小数位数的基本方法是将该数字乘以10^位数,将小数位数向左移动,执行四舍五入,然后除以相同的10^位数,将小数点向右移动

var value:Number = 45 * (1 - (1 / 3));
trace(value); // 30.000000000000004
trace(Math.ceil(value)); // 31
// Round the number to 13 decimal digits.
const POWER:Number = 1e13;
value = Math.round(value * POWER) / POWER;
trace(value); // 30
// Compute number's ceiling.
value = Math.ceil(value);
trace(value); // 30`
这对你的例子很有用,但有一个很大的问题。如果将值更改为
450*(1-(1/3)),您原来的问题将再次出现。现在要去掉它,你必须四舍五入到12位小数。基本上,双精度格式(数字)的有效位可以容纳大约15位有效数字。这意味着,当值增加10倍时,小数点向左移动,最后一个要删除的“4”位数将越来越接近小数点。因此,代码变得更加复杂

var value:Number = 450 * (1 - (1 / 3));
trace(value); // 30.000000000000004
trace(Math.ceil(value)); // 31
var exp:Number = Math.floor(Math.log(Math.abs(value)) * Math.LOG10E);
trace('exp=' + exp); // exp=2
const POWER:Number = Math.pow(10, 14 - exp);
value *= POWER;
trace(value); // 300000000000000.06
value = Math.round(value);
trace(value); // 300000000000000
value /= POWER;
trace(value); // 300
正如您所看到的,无论值的大小,它现在都可以工作。
首先,我通过对数字的绝对值取一个以10为底的对数,然后四舍五入来计算数字的指数。如果您计算
a=value*Math.pow(10,exp),则值可以表示为*10^b,其中(1≤ |a |<10),称为规范化科学记数法。但这不是我们在这里要做的。现在我们知道小数点左边有多少位,我们将把小数点向右移动,但不要太远,以保持一个0和这个我们想要去掉的错误数字,在小数点的右边。因此,乘以10^(14 exp),四舍五入,然后除以相同的幂。

你确定第一段代码实际上没有给你一个值为30的整数吗?出于某种原因,对我来说确实如此。只是好奇。在Flash Builder中,它肯定显示为非整数。为了清晰起见,我省略了具体的数学运算:当45乘以.666(某些数字为6s)667时,我得到了30.000(某些数字为0)0004。你确定第一段代码实际上没有给出一个值为30的整数吗?出于某种原因,对我来说确实如此。只是好奇。在Flash Builder中,它肯定显示为非整数。为了清晰起见,我省略了具体的数学运算:当45乘以.666(某些数字为6s)667时,我得到了30.000(某些数字为0)0004。我的理解()是toFixed返回一个字符串。最优雅的解决方案真的只是把它抛回一个数字吗?很有趣。甚至没有意识到toFixed()返回了一个字符串。这是我能想到的唯一不需要手动执行的简单解决方案。顺便说一句,我希望AS3编译器能够优化这个StringNumber转换,因此我认为性能影响不会很大(如果有的话)。今天晚些时候我们将对此进行实验,并发布一些结果。我也希望如此,但我对AS3非常陌生,而且编译器似乎没有做很多它应该做的事情。例如,优雅地处理在if-else语句的两个不同作用域中定义的相同变量。就我所能找到的而言,没有比将其转换为字符串、截断然后