2013-12-16 14 views
0

我們正在使用3.6版本。我們稱之爲舍入函數來清理小數部分。事情是這樣的......如何修復Adobe Flex簡單乘法錯誤

private function ceilingRounding(value:Number, power:Number):Number 
    { 
    var scale:Number = Math.pow(10, power); 
    return (Math.ceil(value * scale)/scale); 
    } 

函數的結果是出乎意料的下述值: 值= 76.7549,規模= 10000 結果應該是76.7549,但我們得到的76.7550

使用調試器,我們看到這個值* scale = 767549.0000000001。當然這個數字會四捨五入到76.7550,但爲什麼我們會得到.0000000001,我們該如何解決這個問題?

+0

經典[浮點精度(https://www.google.com/search?q=flickr#q=floating+point+precision)問題。它在JavaScript中甚至在Java中都是一樣的(儘管在Java中你將不得不在逗號後遇到更多的地方)。 – RIAstar

+0

如果「76.7549 * 1000000/100」會導致相同的錯誤值,我會同意您的意見,但是我會得到「767549」,並且沒有結尾錯誤。此外,像「22252 - 22252.03」給出了-0.029999999998835847而不是-0.3。在這一點上,似乎沒有Flex操作(數學)可以信任。到目前爲止,我不得不使用GraniteDS BigDecimal來執行基本的數學運算。我也在Flex 4.6中獲得了同樣的行爲。我不知道Apache版本。 – Patrick

+0

關於你的最後一點:Flex的各個版本之間沒有區別;基元和數學運算是純粹的Flash/ActionScript問題,Flex只是一個框架(不幸的是,它沒有BigDecimal等價物)。 – RIAstar

回答

0

「NUMBERS」值包含這個近似運算,您可以修改您的函數並將以下內容添加到運算中,再加上我經常使用的函數進行舍入。

public static function roundToPrecision(numberVal:Number, precision:int = 0):Number 
     { 
      var decimalPlaces:Number = Math.pow(10, precision); 
      return Math.round(decimalPlaces * numberVal)/decimalPlaces; 
     } 

如果需要固定小數嘗試

var myNum:Number = 1.123556789 
myNum.toFixed(3); 
trace(myNum); // 1.123 

如果需要精密的十進制數嘗試

myNum.toPrecision(3); 
trace(myNum); // 1.124; 

更多選項見鏈接四捨五入。

Reference NumberFormatter

+0

我覺得這個答案真的讓人困惑;在逗號後我失去了你。 **什麼**試圖將你的新功能的結果傳遞給**什麼**?新功能是否替代原始問題中的功能?還是它打算溝通別的東西?如果你多加一點解釋;我可以刪除我的downvote。 – JeffryHouser

+0

你好Reboog711,這個想法是用這個函數(我用於舍入)完成「他們」的功能。添加終點線和小數位數。 同樣,你可以重用那個我提到他的NUMBERS的函數,這就是簡單的意圖。 謝謝,您的投票只是不打擾我,如果您認爲答案沒有用,我感覺很好,您給予了負面的反饋。 關於 對不起,我的英文谷歌,不會說流利的英語。 – matilu

+0

請編輯您的問題以添加您在評論中給出的一些說明。 – JeffryHouser