Flex Currencyformatter会自动舍入较大的值

时间:2016-07-27 21:20:14

标签: actionscript-3 flex4 flex3 flex4.6

我们正在使用价值更高的金额。我们在相应的spark TextInput中显示格式化的数量。我们使用简单的mx CurrencyFormatter来格式化金额值。直到16位数我们都没有任何问题。但是在穿过16位数后,这些数字会自动舍入。我们正在使用带有以下配置的CurrencyFormatter,

<mx:CurrencyFormatter id="formateer" thousandsSeparatorTo="," decimalSeparatorTo="."
                              precision="2" currencySymbol="" rounding="none" />

我的输出: 我们没有任何问题,最多16位

original-->1234567890123456
Number(txtInput.text)-->1234567890123456
formatted-->1,234,567,890,123,456.00

输出错误:

original-->12345678901234567
Number(txtInput.text)-->12345678901234568
formatted-->12,345,678,901,234,568.00 

这里最后一位数字7舍入为8。

输出错误:

original-->12345678901234567890
Number(txtInput.text)-->12345678901234567000
formatted-->12,345,678,901,234,567,000.00

我调试了代码并进入了format()方法CurrencyFormatter。实际上,数字转换会出现问题。我想知道,因为Number.MAX_VALUE是1.79769313486231e + 308。

此外,我发现了一个奇怪的数字行为。我在下面描述了,

var a:Number = 2.03;
var b:Number = 0.03
var c:Number = a- b;

trace("c --> "+c);
Output : c --> 1.9999999999999998

此类输出仅用于获取此数字。

请建议我如何解决此问题或建议我采用解决方法。

提前致谢。 Vengatesh s

1 个答案:

答案 0 :(得分:0)

使用64位浮点运算的语言中的大数字是一个常见的问题(例如,Actionscript和Javascript在这里是相同的,举个例子)。

它与CurrencyFormatter无关,如果您尝试trace(12345678901234566+1),您将获得12345678901234568.这是因为该数字有如此多的数字填充64位存储空间,因此它会四舍五入。我意识到解释相当简单,事实上论证非常复杂。

有一些BigInt库已经可用(我认为as3crypt有一个)可以使用,如果你必须做一些算术...格式化我认为你将不得不自己滚动

编辑: 出于好奇,您可以使用this查看您的号码是如何以IEEE754二进制格式表示的