【发布时间】: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