/ BigDecimal.ROUND_HALF_UP का उपयोग करके 0.745 से 0.75 तक का चक्कर कैसे लगाएं - जावा, बिगडेसीमल, गोलाई

BigDecimal.ROUND_HALF_UP का उपयोग करके 0.745 से 0.75 तक कैसे गोल करें? - जावा, bigdecimal, गोलाकार

मैंने निम्नलिखित कोशिश की,

   double doubleVal = 1.745;
double doubleVal1 = 0.745;
BigDecimal bdTest = new BigDecimal(  doubleVal);
BigDecimal bdTest1 = new BigDecimal(  doubleVal1 );
bdTest = bdTest.setScale(2, BigDecimal.ROUND_HALF_UP);
bdTest1 = bdTest1.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("bdTest:"+bdTest); //1.75
System.out.println("bdTest1:"+bdTest1);//0.74    problemmmm ????????????

लेकिन अजीब परिणाम मिले। क्यूं कर?

उत्तर:

उत्तर № 1 के लिए 71

कभी भी फ्लोट्स या डबल्स से बिगडेसिमल का निर्माण न करें। उन्हें चींटियों या तारों से निर्मित करें। तैरता है और ढीली परिशुद्धता को दोगुना करता है।

यह कोड अपेक्षा के अनुसार काम करता है (मैंने टाइपिंग को डबल से स्ट्रिंग में बदल दिया है):

public static void main(String[] args) {
String doubleVal = "1.745";
String doubleVal1 = "0.745";
BigDecimal bdTest = new BigDecimal(  doubleVal);
BigDecimal bdTest1 = new BigDecimal(  doubleVal1 );
bdTest = bdTest.setScale(2, BigDecimal.ROUND_HALF_UP);
bdTest1 = bdTest1.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("bdTest:"+bdTest); //1.75
System.out.println("bdTest1:"+bdTest1);//0.75, no problem
}

जवाब के लिए 9 № 2

उपयोग BigDecimal.valueOf(double d) के बजाय new BigDecimal(double d)। आखिरी में फ्लोट और डबल द्वारा सटीक त्रुटियां हैं।


जवाब के लिए 8 № 3
double doubleVal = 1.745;
double doubleVal1 = 0.745;
System.out.println(new BigDecimal(doubleVal));
System.out.println(new BigDecimal(doubleVal1));

आउटपुट:

1.74500000000000010658141036401502788066864013671875
0.74499999999999999555910790149937383830547332763671875

जो दो युगल के वास्तविक मूल्य को दर्शाता है औरपरिणाम आपको मिलता है। जैसा कि दूसरों द्वारा बताया गया है, डबल कंस्ट्रक्टर का उपयोग न करें (विशिष्ट मामले के अलावा जहां आप एक डबल का वास्तविक मूल्य देखना चाहते हैं)।

डबल परिशुद्धता के बारे में अधिक:


जवाब के लिए 2 № 4

यह शायद आपको एक संकेत देगा कि क्या गलत हुआ।

import java.math.BigDecimal;

public class Main {
public static void main(String[] args) {
BigDecimal bdTest = new BigDecimal(0.745);
BigDecimal bdTest1 = new BigDecimal("0.745");
bdTest = bdTest.setScale(2, BigDecimal.ROUND_HALF_UP);
bdTest1 = bdTest1.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("bdTest:" + bdTest);
System.out.println("bdTest1:" + bdTest1);
}
}

समस्या यह है, कि आपका इनपुट (ए double x=0.745;) ठीक 0.745 का प्रतिनिधित्व नहीं कर सकता है। यह वास्तव में थोड़ा कम मूल्य बचाता है। के लिये BigDecimals, यह पहले से ही 0.745 से नीचे है, इसलिए यह नीचे राउंड ...

उपयोग न करने का प्रयास करें BigDecimal(double/float) कंस्ट्रक्टर्स।


जवाब के लिए 2 № 5

अपनी रुचि के लिए, उसी के साथ करने के लिए double

double doubleVal = 1.745;
double doubleVal2 = 0.745;
doubleVal = Math.round(doubleVal * 100 + 0.005) / 100.0;
doubleVal2 = Math.round(doubleVal2 * 100 + 0.005) / 100.0;
System.out.println("bdTest: " + doubleVal); //1.75
System.out.println("bdTest1: " + doubleVal2);//0.75

या केवल

double doubleVal = 1.745;
double doubleVal2 = 0.745;
System.out.printf("bdTest: %.2f%n",  doubleVal);
System.out.printf("bdTest1: %.2f%n",  doubleVal2);

दोनों छपते हैं

bdTest: 1.75
bdTest1: 0.75

मैं कोड को यथासंभव सरल रखना पसंद करता हूं। ;)

@Mshutov नोट के रूप में, आपको यह सुनिश्चित करने के लिए थोड़ा और जोड़ना होगा कि एक आधा मूल्य हमेशा गोल होता है। ऐसा इसलिए है क्योंकि संख्या की तरह 265.335 दिखाई देने से थोड़ा कम हैं।