我们正在使用价值更高的金额。我们在相应的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
答案 0 :(得分:0)
使用64位浮点运算的语言中的大数字是一个常见的问题(例如,Actionscript和Javascript在这里是相同的,举个例子)。
它与CurrencyFormatter无关,如果您尝试trace(12345678901234566+1)
,您将获得12345678901234568.这是因为该数字有如此多的数字填充64位存储空间,因此它会四舍五入。我意识到解释相当简单,事实上论证非常复杂。
有一些BigInt库已经可用(我认为as3crypt有一个)可以使用,如果你必须做一些算术...格式化我认为你将不得不自己滚动
编辑: 出于好奇,您可以使用this查看您的号码是如何以IEEE754二进制格式表示的