Как бороться с точностью чисел в Actionscript? - PullRequest
17 голосов
/ 11 марта 2009

У меня есть объекты BigDecimal, сериализованные с BlazeDS в Actionscript. Как только они нажимают Actionscript как объекты Number, они имеют такие значения, как:

140475.32 превращается в 140475.31999999999998

Как мне с этим справиться? Проблема в том, что если я использую NumberFormatter с точностью до 2, то значение усекается до 140475.31. Есть идеи?

Ответы [ 14 ]

1 голос
/ 24 августа 2009

Вы можете использовать свойство: округление = "ближайший"

В NumberFormatter округление имеет 4 значения, которые вы можете выбрать: округление = "нет | вверх | вниз | ближе". Я думаю, что в вашей ситуации вы можете выбрать округление = "ближайший".

- чары -

0 голосов
/ 03 августа 2010

Вы можете проголосовать и просмотреть запрос на улучшение в системе отслеживания ошибок Flash PLayer Jira по номеру https://bugs.adobe.com/jira/browse/FP-3315

А пока используйте обходной путь Number.toFixed (), см .: (http://livedocs.adobe.com/flex/3/langref/Number.html#toFixed%28%29)

или используйте реализации с открытым исходным кодом: (http://code.google.com/p/bigdecimal/) или (http://www.fxcomps.com/money.html)

Что касается усилий по сериализации, хорошо, если вы используете Blazeds или LCDS, они будут небольшими, поскольку они поддерживают сериализацию Java BigDecimal (в String), ср. (http://livedocs.adobe.com/livecycle/es/sdkHelp/programmer/lcds/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=serialize_data_3.html)

0 голосов
/ 11 марта 2009

Это больше похоже на проблему с транспортом, правильное число, но масштаб игнорируется. Если число должно быть сохранено как BigDecimal на сервере, вы можете преобразовать его на стороне сервера в менее двусмысленный формат (Number, Double, Float) перед отправкой.

0 голосов
/ 11 марта 2009

Если вы заранее знаете, какая точность вам нужна, вы можете сохранить масштабированные числа так, чтобы наименьшее количество, которое вам нужно, было целым значением. Например, храните цифры в виде центов, а не долларов.

Если это не вариант, как насчет этого:

function printTwoDecimals(x)
{
   printWithNoDecimals(x);
   print(".");
   var scaled = Math.round(x * 100);
   printWithNoDecimals(scaled % 100);
}

(С тем, что вы печатаете без вставленных там десятичных знаков.)

Это не будет работать для действительно больших чисел, потому что вы все еще можете потерять точность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...