【问题标题】:Flex Currencyformatter automatically rounds off the larger valuesFlex Currencyformatter 自动舍入较大的值
【发布时间】:2016-07-27 21:20:13
【问题描述】:

我们正在处理价值较高的金额。我们在各自的 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 。

我还发现了 Number 的另一种奇怪行为。我在下面描述,

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

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

这种输出只针对这个数字。

请建议我如何解决此问题或建议我一种解决方法。

提前致谢。 Vengatesh s

【问题讨论】:

  • 在您的最后一个示例中,使用 c.toFixed(2) 来查看预期结果。

标签: actionscript-3 flex4 flex3 flex4.6


【解决方案1】:

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

它与 CurrencyFormatter 无关,如果您尝试trace(12345678901234566+1),您将得到 12345678901234568。那是因为该数字有太多位填充 64 位存储空间,因此它会被四舍五入。我意识到解释很简单,论据实际上很复杂。

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

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

【讨论】:

  • Number.MAX_VALUE 是 1.79769313486231e+308 。这代表什么?
  • 嗯,这是您可以拥有的最大数字,与此无关。现实情况是,有些数字(主要是大数字和小分数)在这个系统中根本无法拥有
猜你喜欢
  • 2012-03-02
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多