【问题标题】:How to fix Adobe Flex simple multiplication error如何修复 Adob​​e Flex 简单乘法错误
【发布时间】:2013-12-16 15:54:11
【问题描述】:

我们使用的是 3.6 版。我们调用舍入函数来清理小数部分。像这样的……

private function ceilingRounding(value:Number, power:Number):Number
    {
    var scale:Number = Math.pow(10, power);
    return (Math.ceil(value * scale) / scale);
    }

以下值的函数结果是意外的: 值 = 76.7549,比例 = 10000。 结果应该是 76.7549 但我们得到 76.7550

使用调试器,我们看到 value * scale = 767549.0000000001。当然,这会四舍五入到 76.7550,但为什么我们会得到 .0000000001,我们该如何解决这个问题?

【问题讨论】:

  • 经典floating point precision 问题。在 javascript 中甚至在 Java 中都是一样的(尽管在 Java 中你必须在逗号后面走很多地方才能遇到它)。
  • 如果“76.7549 * 1000000 / 100”会导致相同的错误值,我会同意你的看法,但我得到的“767549”没有尾随错误。此外,像“22252 - 22252.03”这样的东西给出 -0.029999999998835847 而不是 -0.3。在这一点上,似乎没有任何 Flex 运算(数学)是可以信任的。到目前为止,我不得不使用 GraniteDS BigDecimal 来执行基本的数学运算。我对 Flex 4.6 也有同样的行为。我不知道Apache版本。
  • 关于您的最后一点:Flex 版本之间不会有任何区别;原语和数学运算是纯粹的 Flash/ActionScript 问题,Flex 只是一个框架(遗憾的是没有 BigDecimal 等效项)。

标签: apache-flex flex3


【解决方案1】:

“NUMBERS”值持有这个近似运算,你可以修改你的函数并将以下内容添加到运算中,另外我让我经常使用的函数进行舍入。

public static function roundToPrecision(numberVal:Number, precision:int = 0):Number
        {
            var decimalPlaces:Number = Math.pow(10, precision);
            return Math.round(decimalPlaces * numberVal) / decimalPlaces;
        }

如果你需要固定十进制数试试

var myNum:Number = 1.123556789
myNum.toFixed(3);
trace(myNum); // 1.123

如果你需要精度十进制数试试

myNum.toPrecision(3);
trace(myNum); // 1.124;

有关更多选项,请参阅链接中的舍入。

Reference NumberFormatter

【讨论】:

  • 我觉得这个答案真的很混乱;在你的逗号之后我失去了你。 What 尝试将新函数的结果传递给 what?新功能是否可以替代原始问题中的功能?或者它是为了传达其他东西?如果您添加更多解释;我可以删除我的反对票。
  • 你好 Reboog711,想法是用这个函数(我用它来舍入)完成“他们的”函数。添加终点线和小数位数以四舍五入。同样,您可以重用我提到他的那个功能,这就是意图。谢谢,您的投票并没有打扰我,如果您认为答案没有用,我很高兴您给予负面反馈。问候对不起我的英语谷歌,不会说流利的英语。
  • 请编辑您的问题以添加您在评论中提供的一些说明。
  • 我是在你发表评论后做的。
  • 感谢您的反馈。我想我可能在这个问题上放得太多了。问题是“价值*比例”似乎引入了一个不能简单四舍五入的错误。在此示例中,值 = 76.7549,比例 = 10000 应使用上限函数返回 76.7549。但是像 value = 76.754900123, scale = 10000 应该返回 76.7550。我看不到如何使用 roundToPrecision 来解决此问题。我有另一个例子,“22252 - 22252.03”给出-0.029999999998835847而不是-0.3。这应该是没有此类错误的简单数学。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 2010-11-16
  • 2010-09-07
  • 1970-01-01
相关资源
最近更新 更多