2013-12-16 1 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

Используя отладчик, мы видим это значение * шкала = 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 (math) нельзя доверять. До сих пор мне приходилось использовать GraniteDS BigDecimal для выполнения основных математических операций. Я также получил такое же поведение с Flex 4.6. Я не знаю о версии Apache. – Patrick

+0

О вашей последней точке: не будет разницы между версиями Flex; примитивы и математические операции являются чистым Flash/ActionScript, Flex - это всего лишь фреймворк (к сожалению, у него нет никакого биг-кода). – RIAstar

ответ

0

Значения «НОМЕРА» сохраняют эту операцию аппроксимации, вы можете изменить свою функцию и добавить в нее следующее, плюс я позволю функции, которую я регулярно использую для округления.

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

Hello Reboog711, идея состоит в том, что с помощью этой функции (которую я использую для округления) выполняю полную «свою» функцию. ДОБАВЛЕНИЕ финишной черты и число десятичных знаков для округления. Аналогичным образом, вы можете повторно использовать эту функцию, которую я упоминаю для NUMBERS, это было просто. Спасибо, ваш голос меня просто не беспокоит, если вы считаете, что ответ не полезен, я чувствую себя хорошо, что вы даете отрицательный отзыв. Отношения Извините за мой английский Google, не говорите свободно владеющего английским языком. – matilu

+0

Измените свой вопрос, чтобы добавить некоторые пояснения, которые вы указали в комментарии. – JeffryHouser

Смежные вопросы