我将BigDecimal对象与BlazeDS序列化为Actionscript.一旦他们将Actionscript作为Number对象命中,它们的值就像:
140475.32
变成 140475.31999999999998
我该如何处理?问题是如果我使用精度为2 的NumberFormatter,那么该值将被截断为140475.31
.有任何想法吗?
这是我对这个问题的通用解决方案(我在这里写了博客):
var toFixed:Function = function(number:Number, factor:int) { return Math.round(number * factor)/factor; }
例如:
trace(toFixed(0.12345678, 10)); //0.1
乘0.12345678
用10
; 这给了我们1.2345678
.
当我们四舍五入1.2345678
,我们得到1.0
,
最后,1.0
除以10
等于0.1
.
另一个例子:
trace(toFixed(1.7302394309234435, 10000)); //1.7302
乘1.7302394309234435
用10000
; 这给了我们17302.394309234435
.
当我们绕过时,17302.394309234435
我们得到17302
,
最后,17302
除以10000
等于1.7302
.
基于下面的匿名答案,对方法的参数进行了很好的简化,使得精度更加直观.例如:
var setPrecision:Function = function(number:Number, precision:int) { precision = Math.pow(10, precision); return Math.round(number * precision)/precision; } var number:Number = 10.98813311; trace(setPrecision(number,1)); //Result is 10.9 trace(setPrecision(number,2)); //Result is 10.98 trace(setPrecision(number,3)); //Result is 10.988 and so on
NB我在这里添加了这个,以防万一有人认为这是答案而且不向下滚动......
对于任何感兴趣的人来说,Frasers功能只是略有不同.
function setPrecision(number:Number, precision:int) { precision = Math.pow(10, precision); return (Math.round(number * precision)/precision); }
所以使用:
var number:Number = 10.98813311; trace(setPrecision(number,1)); //Result is 10.9 trace(setPrecision(number,2)); //Result is 10.98 trace(setPrecision(number,3)); //Result is 10.988 and so on
我Number.toFixed(precision)
在ActionScript 3中使用它来执行此操作:http: //livedocs.adobe.com/flex/3/langref/Number.html#toFixed%28%29
它正确处理舍入并指定小数点后显示的位数 - 与Number.toPrecision()
此不同的是,无论小数位置如何,都会限制显示的总位数.
var roundDown:Number = 1.434; // will print 1.43 trace(roundDown.toFixed(2)); var roundUp:Number = 1.436; // will print 1.44 trace(roundUp.toFixed(2));