四捨五入的數的小數位指定數目的基本方法是乘以10 ^數字的數目由相同的小數點DIGITS位左移,執行舍入,和除法10^DIGITS將小數點移回右側。
var value:Number = 45 * (1 - (1/3));
trace(value); // 30.000000000000004
trace(Math.ceil(value)); // 31
// Round the number to 13 decimal digits.
const POWER:Number = 1e13;
value = Math.round(value * POWER)/POWER;
trace(value); // 30
// Compute number's ceiling.
value = Math.ceil(value);
trace(value); // 30`
它適用於您的示例,但有一個大問題。如果您將您的價值更改爲450 * (1 - (1/3));
,您的原始問題將再次出現。現在擺脫它,你將不得不四捨五入到十二進制數字。基本上,雙精度格式(數字)的有效位數可以保存約15位有效數字。這意味着當數值增加十倍時,小數點向左移動,並且您想要擺脫的最後一個「4」數字越來越接近小數點。所以代碼變得更加複雜。
var value:Number = 450 * (1 - (1/3));
trace(value); // 30.000000000000004
trace(Math.ceil(value)); // 31
var exp:Number = Math.floor(Math.log(Math.abs(value)) * Math.LOG10E);
trace('exp=' + exp); // exp=2
const POWER:Number = Math.pow(10, 14 - exp);
value *= POWER;
trace(value); // 300000000000000.06
value = Math.round(value);
trace(value); // 300000000000000
value /= POWER;
trace(value); // 300
正如你所看到的,它現在可以工作,不管值的大小。 首先,我通過以數字的絕對值的10對數爲底的對數來找到數字的指數,然後將其舍入。如果您計算a = value * Math.pow(10, exp);
,則值可以表示爲a * 10^b,其中(1≤| a | < 10),稱爲標準化科學記數法。但這不是我們在這裏做的。現在我們知道小數點左邊有多少數字,我們將右移小數點,但不要太遠,以保留一個0和我們想要擺脫的錯誤數字,在右邊的小數點。因此,乘以10 ^(14-exp),輪,然後除以相同的權力。
你確定第一段代碼實際上沒有給你一個30的整數嗎?它出於某種原因爲我服務。只是好奇。 –
在Flash Builder中,它肯定顯示爲非整數。爲了清晰起見,我所省略的具體數學:足以說,當乘以0.666(某些數字爲6)667時,我得到了30.000(某個數字爲0)0004。 –