BigDecimal неге екі еседен астам дәлірек болады?

BigDecimal және double арасындағы дәл айырмашылықты білгім келеді. Мен BigDecimal double -дан дәлірек екенін білемін және есептеулер үшін біреуін пайдалануыңыз керек.

Неліктен дәлірек? BigDecimal сияқты жұмыс істейтін етіп, double параметрін өзгерту мүмкін емес? Немесе double көмегімен есептеу үшін артықшылықтар бар ма?

1
Дәл айырмашылықты талқылау: stackoverflow.com/a/5749657/32090
қосылды автор Boris Pavlović, көзі

8 жауаптар

ҮлкенDecimal

Тұрақты, дәлдікке қол жеткізілген ондық сандар. BigDecimal, дәлме-дәл бүтін санның белгісіз мәнінен және 32-биттік бүтін шкаласынан тұрады. Нөл немесе оң болса, масштаб ондық нүктенің оң жағындағы сандар санын білдіреді. Егер теріс болса, санның масштабталмаған мәні масштабтың жоққа шығарылу күшіне он есеге көбейтіледі. Сондықтан BigDecimal ұсынатын санның мәні (unscaledValue × 10 шкаласы).

Double белгілі бір дәлдікке ие.

EDITED: BigDecimal is a real object, not a primitive one. Thus, it abstracts numerical representation and is not bound by physical (read memory) restrictions. courtesy : Max Leske

5
қосылды
Сонымен қатар: BigDecimal - қарабайыр емес ( double ) қарсы нақты нысан, сондықтан ол сандық ұсынуды көрсетеді және физикалық (оқу жады) шектеулермен байланысты емес.
қосылды автор Max Leske, көзі

Двойник - өте жылдам өзгермелі нүктелік деректер түрі, ол көптеген чипсетах өте төмен деңгейде іске асырылады.

Оның дәлдігі көптеген қосымшалар үшін жеткілікті: мысалы: Күннің Плутонды жақын қашықтыққа өлшеуі ең жақын сантиметрге!

Әрдайым, дәлірек деректер түріне көшу туралы ойлағанда, өнімділіктің арақатынасы соңғы болып өте баяу болады және сүйікті математикалық кітапханалар оларды қолдамауы мүмкін. Есіңізде болсын, сіздің бағдарламаңыздың шығысы кіріс сапасының функциясы болып табылады.

Ақырғы ескерту ретінде ешқашан қолма-қол ақшаның мөлшерін көрсету үшін екі есе артық пайдаланбаңыз!

2
қосылды

Операциялар BigDecimal түрінде орындалса, нәтижедегі сандардың саны жиі операндқа қарағанда көбірек болады. Бұл екі маңызды әсерге ие:

  1. BigDecimal жүйесінде мерзімді дөңгелектеу күшейген жағдайда, сандар ұзағырақ және ұзағырақ болғандықтан, баяу және баяу болады.
  2. Ешқандай тіркелген өлшемді контейнер BigDecimal қондырғысы үшін жеткілікті үлкен болмауы мүмкін, себебі олардың контейнерлерін толтырған екі мәннің арасында көптеген операциялар нәтижеге өте ұзақ уақыт береді контейнер мөлшері.

float және double фундаментальды себебі тезірек болуы мүмкін, ал BigDecimal мүмкін емес, себебі олар қажетті деп есептеледі кез-келген есептеуде, түпнұсқа операндалар сияқты контейнердің бірдей көлеміне сәйкес келетін нәтиже береді. Бұл оларға бекітілген мөлшердегі контейнерлерді пайдалануға мүмкіндік береді және кейінгі әрекеттер туралы біртіндеп баяу болуы туралы алаңдамау керек емес.

Айтпақшы, BigDecimal баяу болып табылатын тағы бір маңызды (бірақ азырақ іргелі) себеп, бұл мәндер екілік пішімделген mantissa, бірақ ондық көрсеткішті пайдалану арқылы ұсынылады. Демек, операндалардың дәлдігін түзетуді талап ететін кез-келген операция алдында өте қымбат «қалыпқа келтіру» қадамы болуы керек. Егер қандай да бір құндылықтың біреуі болса, жұмыс істеу оңай болуы мүмкін, осылайша 123,456-дан 0,044-ке дейін 123,500-ден емес, 123,500-ні қосып, бірақ 123,500-ден 123,5-ке дейін қалыпқа келтіру 123.456 және 0.44-ні қосқаннан гөрі әлдеқайда көбірек есептеуді қажет етеді; одан кейін, егер бұл нәтиже ондық нүктеден кейін үш маңызды көрсеткішпен басқа нөмірге қосылса, ертерек қосқаннан кейін орындалатын қалыпқа келтіру келесі әрекетті орындау үшін қажетті уақытты арттырады.

1
қосылды

Неге BigDecimal дәлірек болады?

  1. 64 битте (8 байт) жадтағы екі есе өлшемі тіркелген . Бұл оны 15-17 сандар дәлдік санымен шектейді. BigDecimal сізге қажет кез келген мөлшерге дейін өседі.

  2. Екілік қосарда жұмыс істейді, яғни ол екілік санында соңғы сан ретінде көрінетін сандарды нақты көрсете алады. Мысалы, екілік өлшемдегі 0,375 дәл 0.011. (Басқаша айтқанда, бұл 2 қуаттылықтың сомасы: 2 -2 + 2 -3 ). Бірақ 0,1-ге тең сан нақтылана алмайды екілік ретінде, өйткені екілік жүйеде 0.0001100110011 ... , ол аяқталмайды. BigDecimal ондық қатарда жұмыс істейді, сондықтан ол ондық санмен дәл білетін 0.1 сияқты сандарды дәл көрсете алады. (Дегенмен, дәлме-дәл мәндердің ауқымы кеңейтілсе де, ол негізгі проблеманы жоймайды, мысалы, бір үшіншіден мәнін нақты түрінде көрсетуге болмайды, бинарлық (0.010101 ...) және ондық (0.33333 ...) екеуінде де кеңейтуді тоқтатады.

Есептеу кезінде екі есе артықшылық бар ма?

Мүлдем!

  1. Салыстырмалы түрде кішкене еске түсіруді талап ететіндіктен, екі есе сандардың ұзын массивтеріне әлдеқайда жақсырақ.

  2. Қосарланған екілік пішім оны жылдам етеді. Оны бағдарламалық жасақтама мен аппараттық құралдарда да тиімді өңдеуге болады. Процессорлар арнайы схемада қос арифметиканы қолданады.

  3. BigDecimal көмегімен нысан қайтадан есептеледі, өйткені қайта есептеу бірнеше есе көп фракцияларды шығара алады, бірақ бұл мөлшері екі есе қостау керек емес, себебі оның өлшемі бекітілген. >

Неліктен ол BigDecimal сияқты жұмыс істейтін етіп екі есе теңшеуге болмайды?

Сіз өзіңіз үшін төлейтін нәрсені аласыз. BigDecimal күшті болуы мүмкін, бірақ оның күрделілігі есептеуді баяу етеді, ол көп жадыға ие болады және оны пайдалану өте күрделі. Барлық пайдалану жағдайларын қанағаттандыратын сандық деректер түрі жоқ, сондықтан қолданбаның қажеттілігіне байланысты қалағаныңызды таңдауға тура келеді.

1
қосылды

екі еселенген мәнді көрсету үшін 8 байт, оның дәлдігі 15 ондық санмен шектеледі, қараңыз: http://en.wikipedia.org/wiki/IEEE_754-1985 . BigDecimal дәлдігі - дефолт шексіз, себебі ол еркін ұзындығының ішкі массасына негізделген. Екі еселенген әрекеттер BigDecimal-қа қарағанда әлдеқайда жылдам болса да, бұл деректер түрі ешқашан валюта сияқты нақты мәндер үшін пайдаланылмауы керек.

1
қосылды

double көмегімен есептеу BigDecimal -дан әлдеқайда тезірек, себебі ол сізде математикалық амалдардың толық ауқымын сіздің саусақ ұштарыңызда бар.

BigDecimal is great if you need to perform very precise calculations but you pay a price for that such as not having easy access to a square root function that actually works on a BigDecimal and generally much slower calculations.

0
қосылды

Анықтау бойынша, double дәлме дәлдікке ие (2 негіздегі 53 сан). Оның басты артықшылығы - бұл өте жылдам, өйткені іс жүзінде негізгі операциялар толықтай аппараттық құралдарда жүзеге асырылады. Егер мұндай дәлдік және/немесе 2-негіздеме қолданбаңызға бейімделмесе, еркін дәлдік арифметикасын қолдана аласыз. BigDecimal стандарты болып табылады және базаны пайдаланады. Алайда GNU MPFR Java байланыстары a> (Мен тырыспадым), сондықтан сіздің есептеулеріңізді GNU MPFR кітапханасымен жасай аласыз. 2 негізін пайдаланады және BigDecimal қарағанда айтарлықтай жылдам болуы керек.

0
қосылды

Мен Double проблемасымен айналысқан кезде оның дәлдігі шектелген, сондықтан дәлірек шектеуден артық пайдаланған кезде, құндылық дөңгелектеледі, бірақ үлкен Ондық жағдайда бұл мәселеге тап болмайды

0
қосылды