Java - Плаваща запетая с ограничени десетични знаци, но без запетая

Разработвам графично изчислително приложение за моя курс по компютърни науки. Правя много изчисления върху вектори, но понякога получавам някои сериозни съкращения, тъй като това е плаваща аритметика.

Проблемът е, че опитах някои начини за ограничаване на десетичните знаци на числата с плаваща запетая до, например, 2 места. Ето някои неща, които опитах:

1 – Разделете и умножете по 100. Това не работи винаги. Всъщност това никога не работи за мен.

2 - Използвайте DecimalFormat. Този начин на форматиране работи добре, ако имам числа под 1000. Когато имам числа като 1003.3124, той форматира до 1003.31. Тъй като това форматиране връща низ, функцията за синтактичен анализ за Floats не работи поради кома. Опитах се да настроя DecimalFormatSymbols() setGroupingSeparator на различни знаци, включително без интервал и без дължина ( 'ȀB', '', ...), но получавам '?' вместо желания символ.

3 - Задайте локала на САЩ. Тъй като моят Windows работи на бразилски португалски (тук точката и запетаята имат различни документи: вашите 1300,42 са нашите 1300,42!), мисля, че това е глупаво, но не това е въпросът тук. Това също не реши нищо.

4 - Вземете низа, премахнете запетаите и върнете числото Float. Това е, което правя сега и работи правилно. Въпреки това, тъй като това е графично приложение, аз правя нормализации през цялото време с числата. Така че String решението винаги е твърде тежко.

Така че знаете ли за друг начин за решаване на този проблем? Трябва ми най-оптимизираният. Съжалявам, ако не съм бил ясен.


person Felps    schedule 02.05.2013    source източник
comment
Искате ли да ограничите десетичните знаци само за показване или за вътрешно съхранение/изчисление?   -  person leonbloy    schedule 02.05.2013


Отговори (3)


Предлагам ви просто да използвате float за изчисляване и ако искате да покажете числата с точно 2 цифри след точката/запетая, използвайте String.format.

Да се ​​опитвате да го направите в RAM, за да оптимизирате изчисленията, вероятно не е добра идея, тъй като float вече са примитивен тип, който е изключително оптимизиран от Java и хардуера.

person LionC    schedule 02.05.2013
comment
Вероятно това е, което ще направя. Няма нужда да ограничавате плаващите в паметта. Благодаря за вашият отговор. - person Felps; 02.05.2013

Не е ясно дали се занимавате с проблеми с дисплея или вътрешна памет/изчисление. Ако е по-късно, прочетете за BigDecimal .

АКО проблемът ви е само с показването, тогава използвайте подходящия DecimalFormat. Съвсем не разбирам какво имате предвид с „Тъй като това форматиране връща низ, функцията за анализ на Floats не работи“, защо искате да го анализирате?

person leonbloy    schedule 02.05.2013
comment
Искам да анализирам, за да съхраня новия форматиран Float. Ще разгледам BigDecimal. Благодаря ти. - person Felps; 02.05.2013

Едно решение на този проблем може да бъде да прехвърлите вашия float като цяло число след умножение по 100, след което да го прехвърлите като float след това. Пример:

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

Не съм сигурен колко добре работи това по отношение на паметта или скоростта, но със сигурност е един от начините да го направите.

person Liam    schedule 02.05.2013
comment
Това не работи за Floats. Опитах го два пъти и е достатъчно добър, но по някаква причина Float не се променя. - person Felps; 03.05.2013