2011-04-11 19 views
2

我正在编辑一个带数字的字段。我尝试了一个文本字段,但由于它是一个数字数据类型进来,它并不顺利 - 尽管重新编写字符串作为数字等..它不断给我NaN作为价值。所以我决定最好使用数字步进器。数值步进小数的奇怪行为

当我最初加载它会放弃我所有的小数,只显示我的整数数字。我将stepIncrement更改为0.1,现在它显示小数(一个奇怪的要求imo)..但是当我加强时,偶尔给我一个像'17.700000000000003'的值,当我期望17.7时。我的数据中的所有数字都有一个小数位。我知道我可以写一个数据格式化器,但在这种情况下似乎不需要。

有没有另一种方法可以解决这个问题?

回答

7

你已经偶然发现了试图用IEEE 754等浮点二进制格式表示十进制数的妥协方法。并不是所有的十进制数都可以精确表示。您可以在这里中非常详细地在这个问题上读了起来:

http://en.wikipedia.org/wiki/Floating_point#Representable_numbers.2C_conversion_and_rounding

您可以使用Number.toFixed(参数fractionDigits:UINT)显示到小数点后任意数量。

+0

啊!不幸的是toFixed是一个字符串值,我需要从我的数据库输入和输出数字。我尝试'.toFixed(1)as Number',但它不管数值如何都会以0.1结尾。 – Damon 2011-04-12 01:19:20

+0

听起来很可行。我不是一个Flex框架用户,但是对组件描述的快速浏览让我认为你可以动态地操纵步进器的textField(TextInput)的maxChars属性来隐藏不精确性。将maxChars设置为四舍五入为整数的数字位数加1.如果您仍然希望支持手动输入数字,那么可能会有点不方便(例如,如果您必须删除对焦点的限制)。 – 2011-04-12 01:25:03

+0

非常符合逻辑!不幸的是,事实证明,maxChars是“你”可以输入的字符的数量,而不是可以显示的字符的数量...... – Damon 2011-04-12 01:36:41

0

您可以使用valueFormatFunction,它接受数值并将其格式化为一个字符串。您需要在数字步进器上设置明确的宽度,以使它们适合。

0

在MXML

<s:NumericStepper valueFormatFunction="stepperFormatter"/> 

在脚本

protected function stepperFormatter(newValue:Number):String 
{ 
    return Math.ceil(newValue).toString() 
}