Java - плавающая запятая с ограниченным десятичным разрядом, но без запятой

Я разрабатываю приложение для графических вычислений для своего курса информатики. Я делаю много вычислений над векторами, но иногда я получаю серьезные усечения, так как это арифметика с плавающей запятой.

Проблема в том, что я пробовал несколько способов ограничить десятичные разряды чисел с плавающей запятой, например, двумя знаками. Вот некоторые вещи, которые я пробовал:

1 - Разделите и умножьте на 100. Это работает не всегда. На самом деле это никогда не работает для меня.

2 - Используйте десятичный формат. Этот способ форматирования хорошо работает, если у меня есть числа до 1000. Когда у меня есть числа, такие как 1003.3124, он форматируется до 1,003.31. Так как это форматирование возвращает строку, функция разбора для чисел с плавающей запятой не работает из-за запятой. Я попытался установить для DecimalFormatSymbols() setGroupingSeparator разные символы, включая символы без пробела и без длины ('ȀB', '',...), но я получаю '?' вместо желаемого символа.

3 - Установите Локаль на США. Так как моя винда работает на бразильском португальском (здесь у точки и запятой разные бумаги: у вас 1300,42 это у нас 1300,42!) думаю это глупо, но тут не в этом вопрос. Это тоже ничего не решало.

4 - Возьмите строку, удалите запятые и верните число с плавающей запятой. Это то, что я делаю сейчас, и это работает правильно. Однако, поскольку это графическое приложение, я все время выполняю нормализацию с числами. Таким образом, решение String всегда слишком тяжелое.

Итак, вы знаете другой способ решения этой проблемы? Мне нужен самый оптимизированный. Извините, если я не был ясен.


person Felps    schedule 02.05.2013    source источник
comment
Вы хотите ограничить десятичные разряды только для отображения или для внутреннего хранения/вычислений?   -  person leonbloy    schedule 02.05.2013


Ответы (3)


Я бы посоветовал вам просто использовать float для расчета, и если вы хотите отображать числа ровно с двумя цифрами после точки/запятой, вы используете String.format.

Попытка сделать это в оперативной памяти для оптимизации вычислений, вероятно, не лучшая идея, поскольку числа с плавающей запятой уже являются примитивным типом, чрезвычайно оптимизированным для Java и аппаратного обеспечения.

person LionC    schedule 02.05.2013
comment
Наверное, это то, что я собираюсь сделать. Нет необходимости ограничивать поплавки в памяти. Спасибо за Ваш ответ. - person Felps; 02.05.2013

Неясно, имеете ли вы дело с проблемами отображения или внутренней памятью/вычислениями. Если позднее, прочтите о BigDecimal. .

ЕСЛИ ваша проблема связана только с отображением, используйте соответствующий DecimalFormat. Я совершенно не понимаю, что вы подразумеваете под «Поскольку это форматирование возвращает строку, функция синтаксического анализа для поплавков не работает», почему вы хотите ее проанализировать?

person leonbloy    schedule 02.05.2013
comment
Я хочу, чтобы Parse сохранил новый формат Float. Я посмотрю на BigDecimal. Спасибо. - person Felps; 02.05.2013

Одним из решений этой проблемы может быть преобразование вашего числа с плавающей запятой в целое число после умножения на 100, а затем преобразование его в число с плавающей запятой после этого. Пример:

float x = 20;
float y = (float)Math.PI;
float total = (float)(int)((x+y)*100)/100;

Я не уверен, насколько хорошо это работает с точки зрения памяти или скорости, но это, безусловно, один из способов сделать это.

person Liam    schedule 02.05.2013
comment
Это не работает для поплавков. Я попробовал его с двойным, и он достаточно хорош, но по какой-то причине Float не меняется. - person Felps; 03.05.2013