سؤال

كيف يمكنني جولة مزدوجة إلى 5 منازل عشرية، دون استخدام DecimalFormat?

هل كانت مفيدة؟

المحلول

يمكنك الجولة إلى المكان العشري الخامس عن طريق جعلها أول مكان عشري بضرب رقمك. ثم قم بالتوليد العادي، وجعلها المكان العشري الخامس مرة أخرى.

دعنا نقول القيمة إلى الجولة هي double اسم الشيئ x:

double factor = 1e5; // = 1 * 10^5 = 100000.
double result = Math.round(x * factor) / factor;

إذا كنت ترغب في جولة إلى 6 منازل عشرية، فاترك factor يكون 1e6, ، وما إلى ذلك وهلم جرا.

نصائح أخرى

كل ما تفعله، إذا انتهى بك الأمر مع double القيمة من غير المرجح أن تكون بالضبط 5 منازل عشرية. هذا ليس مجرد طريقة أعمال الحسابية النقطة العائمة الثنائية. أفضل ما عليك فعله هو "القيمة المزدوجة الأقرب إلى القيمة الأصلية تقريب إلى 5 منازل عشرية ". إذا كنت تريد طباعة بالضبط قيمة ذلك المزدوجة، فمن المحتمل أن يكون لديك أكثر من 5 منازل عشرية.

اذا أنت حقا تريد القيم العشرية الدقيقة، يجب عليك استخدامها BigDecimal.

اضرب بنسبة 100000. أضف 0.5. اقتطع إلى عدد صحيح. ثم قسم 100000.

رمز:

double original = 17.77777777;
int factor = 100000;
int scaled_and_rounded = (int)(original * factor + 0.5);
double rounded = (double)scaled_and_rounded / factor;

إذا كنت بخير مع المكتبات الخارجية، فيمكنك إلقاء نظرة على microfloat., ، خاصة Microdouble.Tostring (مزدوج D، بطول INT).

حاول القيام بما يلي

double value = Double.valueOf(String.format(Locale.US, "%1$.5f", 5.565858845));

System.out.println(value); // prints 5.56586

value = Double.valueOf(String.format(Locale.US, "%1$.5f", 5.56585258));

System.out.println(value); // prints 5.56585

أو إذا كنت تريد الحد الأدنى من الكود

استخدام استيراد ساكنة

import static java.lang.Double.valueOf;
import static java.util.Locale.US;
import static java.lang.String.format;

و

double value = valueOf(format(US, "%1$.5f", 5.56585258));

مع تحياتي،

DecimalFormat roundFormatter = new DecimalFormat("########0.00000");

public Double round(Double d)
    {
        return Double.parseDouble(roundFormatter.format(d));
    }
public static double roundNumber(double num, int dec) {
        return Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
}

تعثرت هنا تبحث عن وسيلة للحد من رقمي المزدوج إلى منزلين عشري، لذلك لا اقتطاع ولا تقريبها. تمنحك Math.truncate الجزء المتكامل من الرقم المزدوج ويتجاهل كل شيء بعد النقطة العشرية، لذلك يصبح 10.123456 10 بعد اقتطاع. Math.Round Rounds الرقم إلى أقرب قيمة جزء لا يتجزأ حتى يصبح 10.65 11 حين أن 10.45 يصبح 10. لذلك لم يلبي كل من هذه الوظائف احتياجاتي (أتمنى لو كنت قد حملت على حد سواء للسماح بالاقتطاع أو التقريب عدد المنازل العشرية). أسهل طريقة للقيام بما أحتاج إليه هو:

//First create a random number 
Random rand = new Random();

//Then make it a double by getting the NextDouble (this gives you a value 
//between 0 and 1 so I add 10 to make it a number between 10 and 11
double chn = 10 + rand.NextDouble();

//Now convert this number to string fixed to two decimal places by using the
//Format "F2" in ToString
string strChannel = chn.ToString("F2");

//See the string in Output window
System.Diagnostics.Debug.WriteLine("Channel Added: " + strChannel);

//Now convert the string back to double so you have the double (chn) 
//restricted to two decimal places
chn = double.Parse(strChannel);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top