Обзалагам се, че имаше подобен въпрос тук на SO, просто не можах да го намеря. Въпросът е за коригиране на неточност на математиката в Java, когато получа например число като 235.00000002
или 9875.999999997
. По дяволите, за човек тези две всъщност означават 235
и 9876
, когато е даден определен праг на точност, нека го наречем "5 нули или деветки".
Но не става въпрос само за цифрите вдясно от десетичната запетая, същото правило трябва да важи и за числа като 23500000001.0
и 5699999999.0
Някакви идеи/библиотеки?
Актуализация: Изглежда, че сгреших, като казах, че е известна тема и е въпрос на минути, докато някой изскочи с известна библиотека. И така, ето логиката, която очаквам: За дадено число, когато се срещнат N последователни нули или деветки в низовото му представяне, тогава тези нули и деветки се закръглят заедно с останалата част от числото вдясно от най-десния "0" или " 9". Например, когато N=5, числото 239999995.546
става 240000000.0
, числото 34.0000007
става 34
, както и 340000.007
става 340000
.
Актуализация 2: Това се случва, когато бързаме или не обръщаме достатъчно внимание на въпроса. съжалявам Говоря за "човешко" закръгляване. Добър пример би бил сравняването на изхода на df
и df -h
на linux кутия. Що се отнася до „неточността“, за която говорех, моля, изпълнете следния код:
double d = 1000.0;
double mult = 0.12351665;
System.out.println(d * mult / mult);
Отговорът определено не е този, който бихте показали в пазарска количка. В моя случай ситуацията е още по-лоша, не става въпрос само за парите, с които се занимавам, те могат да бъдат всякакви - проценти, големи числа, малки дроби и всички те са резултат от относително тежки математически изчисления. Така че говоря за закръгляването, което има смисъл за човек.
Вече приключих с кода, но все още има шанс някой да го е направил по-добре.
239999995.546
е по-лошо от239989995.546
? Но може би нещо като този въпрос ще ви помогне: stackoverflow.com/questions/7906996/ - person Sebastian Höffner   schedule 26.04.2014240000000.0
запазва.0
, докато340000
и34
не го правят? Също така научната нотация, предоставена от Formatter%e
, може да ви помогне, тя дава2.400000e+08
за239999995.546
- person Sebastian Höffner   schedule 26.04.2014.0
, то може да бъде пропуснато, това е просто начинът да се покаже, че все още е двоен. - person andbi   schedule 26.04.2014BigDecimal
, изглежда е точно това, от което се нуждаете. Проблемът, с който се сблъсквате там, е свързан с точността на плаваща запетая, не става дума за форматиране на резултати или нещо подобно. Опитайте1000.0 * 0.123 / 0.123
и няма да имате проблем с получаването на999.99999
като резултат. Вие обаче казвате, че сте направили кода, но може би някой би могъл да го направи по-добре - какво ще кажете да ни предоставите кода и ние да видим дали можем да го подобрим? - person Sebastian Höffner   schedule 26.04.2014System.out.println(simplify(d*mult/mult));
отпечатва1000
. - person Sebastian Höffner   schedule 26.04.2014BigDecimal
само за валути - и вашите примери за проценти, големи числа, малки дроби и т.н. пасват идеално на приложения за BigDecimals. - person Sebastian Höffner   schedule 26.04.2014